import java.util.*;
import java.lang.*;
import java.io.*;
class Book {
private String author;
private String title;
public Book(String author, String title) {
this.author = author;
this.title = title;
}
public String toString() {
return "Title: \"" + title + "\", author: " + author;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public boolean equals(Object o) {
Book e = (Book) o;
return (author.equals(e.getAuthor())) &&
(title.equals(e.getTitle()));
}
public int hashCode() {
return getAuthor();
}
}
class HashMapBooksLibary {
private Map<Book, String> newMap;
public HashMapBooksLibary(Map<Book, String> newBooksMap) {
this.newMap = newBooksMap;
}
int booksHashMap = 100;
public void addBooksToHashMapList() {
for(int n = 0; n < booksHashMap; n++) {
newMap.put(new Book("Title nr " + n, "Author nr " + n), "Signature nr " + n);
}
}
public void hashMapProcessor() {
System.out.println("Quantity of elements in the HashMap the collection: " + newMap.size());
System.out.println();
newMap.put(new Book("Title nr " + booksHashMap, "Author nr " + booksHashMap), "Signature nr " + booksHashMap);
System.out.println("Quantity of elements in the HashMap the collection: " + newMap.size());
newMap.remove(new Book("Title nr " + booksHashMap, "Author nr " + booksHashMap));
System.out.println();
System.out.println("Quantity of elements in the HashMap the collection: " + newMap.size());
}
}
class LinkedListExample
{
public static void main (String[] args) throws java.lang.Exception
{
Map<Book, String> newMap = new HashMap<Book, String>();
HashMapBooksLibary processor = new HashMapBooksLibary(newMap);
processor.addBooksToHashMapList();
processor.hashMapProcessor();
}
}
mam problem :
1.aby usunąć obiekt z listy
2. oraz hashcode nie wiem jak zrobić
brakuje mi już pomysłów, będę wdzięczny za pomoc. dziękuję
Spróbuj jeszcze raz opisać problem, tym razem zrozumiale.
ok
1.chciałbym za pomocą metody hashMapProcessor usunąć obiekt z newMap.
Jak dodaję obiekt za pomocą: newMap.put(new Book("Title nr " + booksHashMap, "Author nr " + booksHashMap), "Signature nr " + booksHashMap); - działa dodaje mi obiekt, ale jak chciałbyn teraz usunąć za pomocą: newMap.remove(new Book("Title nr " + booksHashMap, "Author nr " + booksHashMap)); nie usuwa mi. Próbowałem różnych zapisów, ale bezskutecznie.
2. nie wiem jak zrobić metodę HashCode
Skąd wiesz, że nie usuwa? Kod jest błędny, nie da się go skompilować i uruchomić. Zmieniłem metodę hashCode
i działa.
public int hashCode() {
return (author + title).hashCode();
}
bogdans napisał(a):
Skąd wiesz, że nie usuwa? Kod jest błędny, nie da się go skompilować i uruchomić. Zmieniłem metodę
hashCode
i działa.public int hashCode() { return (author + title).hashCode(); }
A to ciekawostka - bo albo czegoś nie widzę, albo stary kod hashCode tez był "dobry". (Dobry co do spełniania zasad).
bogdans napisał(a):
Skąd wiesz, że nie usuwa? Kod jest błędny, nie da się go skompilować i uruchomić. Zmieniłem metodę
hashCode
i działa.public int hashCode() { return (author + title).hashCode(); }
dokładnie.zmiana zapisu metody i kod działa. Wcześniej jak zakomentarzowałem metodę HashCode to kompilował się kod, ale nie usuwał obiektu. Teraz po prawidłowym zapisie metody HashCode , kod się kompiluje i usuwa obiekt. Wszystko działa tak jak powinno.
Dziękuję serdecznie za pomoc.
jarekr000000 napisał(a):
bogdans napisał(a):
Skąd wiesz, że nie usuwa? Kod jest błędny, nie da się go skompilować i uruchomić. Zmieniłem metodę
hashCode
i działa.public int hashCode() { return (author + title).hashCode(); }
A to ciekawostka - bo albo czegoś nie widzę, albo stary kod hashCode tez był "dobry". (Dobry co do spełniania zasad).
Też tak myślałem, ale nie działał :(
Ja bym jeszcze zmienił metodę equals
.
public boolean equals(Object o) {
Book e = (Book) o;
return (author + title).equals(e.getAuthor() + e.getTitle());
}
(Żeby metoda hashCode
zwracała różne liczby na "nierównych" obiektach.)
bogdans napisał(a):
Ja bym jeszcze zmienił metodę
equals
.public boolean equals(Object o) { Book e = (Book) o; return (author + title).equals(e.getAuthor() + e.getTitle()); }
(Żeby metoda
hashCode
zwracała różne liczby na "nierównych" obiektach.)
słusznie. zmienione. dziękuję
bogdans napisał(a):
Ja bym jeszcze zmienił metodę
equals
.public boolean equals(Object o) { Book e = (Book) o; return (author + title).equals(e.getAuthor() + e.getTitle()); }
(Żeby metoda
hashCode
zwracała różne liczby na "nierównych" obiektach.)
Po piersze wcale nie zwróci różnych na nierównych, bo ciężko by nawet było. A "Stefan Zenek" i "Zenek Stefan" dadzą oczywiście to samo. (A są bardziej nietrywialne przypadki).
Po drugie wcale nie musi i warto o tym pamiętać.
Mus musi zachodzić warunek w druga stronę : równe w sensie equals obiekty muszą mieć równe hashCody.... reszta to tylko kwestia wydajnośći.
int hashCode() { return 1;} // jest w sensie kontraktu poprawny. Zawsze.
Choć w przypadku wsadzania dużej ilości takich obiektów do hashMapy gwarantuje problemy wydajnościowe.
- Oczywiście,że zwróci: Obiekty Book("aa","aaa") oraz Book("aaa","aa") są różne, a metoda
hashCode
zwraca dla nich to samo. - Czy ja gdzieś napisałem, że metoda
hashCode
musi zwracać różne wartości na "nierównych" obiektach?