[HashMap] Prośba o wyjaśnienie mapy w mapie

0

Witam
Głowię się nad tym już dłuższy czas i pojąć tych map nie mogę.

HashMap przechowuje klucz K i wartość V. Z tym że wartość jak i klucz mogą być innymi obiektami.

Najprostszy przykład, załóżmy że mamy Przedmiot -> Studenta -> Ocenę

Więc można utworzyć taką mapę (z książki Thinking in Java):

public static Map<Przedmiot, List<?extends Student>>przedm=new HashMap<Przedmiot, List<?extends Student>>();
przedm.put(new Przedmiot("Przedm1"),Arrays.asList(new Student("Kowalski"),new Student("Nowak")));

Ale jak dołączyć do tego Ocenę? Czyli aby Student i Ocena tworzyło nową mapę, a wynik wyglądał następująco:
Przedm1: Kowalski (5 ; 3.5), Nowak (3.5 ; 4.0)
Przedm2 itp

0

Co broni przed:

Map<Przedmiot, Map<?extends Student, Ocena o>>przedm=new HashMap<Przedmiot, Map<?extends Student, Ocena o>>();

przy czym jeżeli pojawia się taka potwora to oznacza, że należy stworzyć nową klasę, a nie kombinować z listami/mapami list/map.

0

Dziękuję, tak właśnie próbowałem ,ale bardziej sprawił mi kłopot umieszczenia tej Oceny w mapie, czyli odpowiednia modyfikacja

przedm.put(new Przedmiot("Przedm1"),Arrays.asList(new Student("Kowalski"),new Student("Nowak")));

Więc jeszcze proszę o pokazanie jak ten zapis powinien prawidłowo wyglądać (nie wiem dlaczego ale z różnych opcji zapisu mapy w mapie czy listy w mapie, właśnie ten zapis do mnie najbardziej przemawia, bo po kolei widać co gdzie wstawiam.

0

class Uczestnik {
	private final Ocena ocena;
	private final Student student;

	public Uczestnik(Ocena ocena, Student student) {
		this.ocena = ocena;
		this.student = student;
	}

	public Ocena getOcena() {
		return ocena;
	}

	public Student getStudent() {
		return student;
	}
}

//...
Map<Przedmiot, List<Uczestnik>> przedmioty = new HashMap<Przedmiot, List<Uczestnik>>();

I moje pytanie brzmi czy tak nie jest łatwiej?

0

I ostatnia rzecz [wstyd]
Jak dotrzeć do elementów, bo ten zapis mi nie działa

for (Przedmiot przedm:przedmioty.keySet()){
	System.out.print(przedm);
	for (Uczestnik stud:przedmioty.get(przedm))
		System.out.print(" "+stud);

}

Wyświetla nazwę przedmiotu poprawnie, ale dalej krzaczki

Dziękuję bardzo za wcześniejsze podpowiedzi :-)

0

Nie iteruj się tak przez mapę :) To jest bardzo niewydajne.

Set<Entry<Key, Value>> entrySet = immtfiles.entrySet();
for (Entry<Key, Value> entry : entrySet) {
 // twój kod
}

Krzaczki oznaczają, że nie zaimplementowałeś metody toString() i została użyta implementacja domyślna, która wyrzuca identyfikator obiektu w JVM.

0

Piękne dziękuję. Faktycznie, zapomniałem o toString
no i w klasie Ocena trzeba było zamienić z double

		public String toString(){
			return Double.toString(ocena);
		}

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