• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

W HashMap'ie, pojawia się klucz z wartością, którego w ogóle nie powinno tam być.

Aruba Cloud - Virtual Private Server VPS
0 głosów
136 wizyt
pytanie zadane 16 czerwca 2019 w Java przez zgredek56 Nowicjusz (150 p.)

Witam,

Pisze do was z prośbą o pomoc, gdyż pojawił się u mnie problem, którego według mnie w ogóle nie powinno być.

Cały temat projektu raczej nie ma znaczenia, ale w jednej jego części pobieram z pliku txt dane, plik wygląda tak:

"osobowy Volvo 2012 5L/100km
ciezarowy Mercedes 2018 6L/100km
F1 Ferrari 2019 10L/100km
dostawczy Mercedes 2017 5L/100km
F1 Porsche 2019 10L/100km"

Napisałem kod, który według mnie powinien przypisywać z kolejnych linii dane o samochodach do HashMap<String,ArrayList<Dana>> (Klucz to po prostu pierwsza dana o samochodzie np. "osobowy", a "Dana" to po prostu te wszystkie dane o samochodzie) . W warunku if(linia nr 16)sprawdzam czy nie ma już takiego klucza w HashMap'ie i jeśli nie ma to dodaje do niej dane, a jeśli już jest(powtarzają się "F1") to nadpisuje ArrayList'ę przypisaną do tego klucza kolejnymi danymi i tutaj powstaje problem, gdyż w linii nr 19 przypisując do innej ArrayList'y(dana2) ArrayListę z pierwszą linią o danym rodzaju samochodu(ArrayList<Dana> dana2 = samochody.get(rodzaj);) okazuje że przypisuję linię kolejną z rodzaju "F1" czyli Porsche, a nie Ferrari tak jak powinno być, a przecież nigdzie jeszcze tej linii do HashMap'y nie wrzuciłem.

        HashMap<String,ArrayList<Dana>> samochody = new HashMap<>();
	ArrayList<Dana> ostateczne = new ArrayList<Dana>();

try (BufferedReader br = new BufferedReader(new FileReader("Cars.txt"))) {
		String line;
		while ((line = br.readLine()) != null) {
			String[] info = line.split(" ");
			
			 String rodzaj = info[0];
			 String marka = info[1];
			 String rokProdukcji = info[2];
			 String zużyciePaliwa = info[3];
			 
			 ostateczne.add(new Dana(rodzaj, marka, rokProdukcji, zużyciePaliwa));

				 if(samochody.containsKey(rodzaj)==false) {
					 samochody.put(rodzaj ,ostateczne);
				 }else if(samochody.containsKey(rodzaj)==true){
					 ArrayList<Dana> dana2 = samochody.get(rodzaj);
					 dana2.add(ostateczne.get(0));					 
					 samochody.replace(rodzaj, dana2);

					 dana2.clear();
				 }
			 ostateczne.clear();
		}
	} catch (Exception exc) {
		exc.printStackTrace();
		System.exit(1);
	}

 

1 odpowiedź

+2 głosów
odpowiedź 16 czerwca 2019 przez Aisekai Nałogowiec (42,190 p.)
wybrane 16 czerwca 2019 przez zgredek56
 
Najlepsza
Nie analizowałem twojego kodu jakoś bardzo, ale parę rzeczy rzuciło mi się w oczy.

Zanim jednak powiem co, to musisz wiedzieć, że dane np w tablicy czy mapie, przechowywane są na zasadzie referencji. Tzn jeżeli masz jakiś obiekt, który wrzucisz do mapy i zmienisz ten obiekt, to zmiana będzie widoczna też na tym obiekcie przechowywanym w Mapie (to jest ten sam obiekt).

Po pierwsze: takie "względnie" globalne zmienne to jest problem. Jeżeli w pierwszej iteracji while() dodasz do mapy wartość ostateczne, a w drugiej dodasz coś do ostateczne - zmienisz wartość też w mapie.

Po drugie: czyszcząc dana2 i ostateczne, po wyjściu z pętli while, sprawdzilbym czy rzeczywiście jakieś wartości w Mapie się znajdują - obstawiam, że nie.
komentarz 16 czerwca 2019 przez zgredek56 Nowicjusz (150 p.)
Dzięki wielkie, rzeczywiście w mapie nic nie było......, ale dzięki twoim wskazówkom już sobie poradziłem ze wszystkim.

Podobne pytania

0 głosów
1 odpowiedź 360 wizyt
pytanie zadane 14 listopada 2021 w Java przez Uczen12345 Obywatel (1,800 p.)
0 głosów
1 odpowiedź 331 wizyt
pytanie zadane 19 kwietnia 2020 w Java przez Avalansz Użytkownik (580 p.)
0 głosów
2 odpowiedzi 601 wizyt
pytanie zadane 17 maja 2022 w Java przez Arek Kowalski Początkujący (450 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,662 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...