HashMap - problem z usunięciem obiektu

0
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();		
	}	
}
0

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ę

0

Spróbuj jeszcze raz opisać problem, tym razem zrozumiale.

0

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

0

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();
    }
0
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).

0
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.

0
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ł :(

1

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.)

0
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ę

0
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.

0
  1. Oczywiście,że zwróci: Obiekty Book("aa","aaa") oraz Book("aaa","aa") są różne, a metoda hashCode zwraca dla nich to samo.
  2. Czy ja gdzieś napisałem, że metoda hashCode musi zwracać różne wartości na "nierównych" obiektach?

1 użytkowników online, w tym zalogowanych: 0, gości: 1