• 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ć.

HackNation - ogólnopolski hackathon
0 głosów
183 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ź 401 wizyt
pytanie zadane 14 listopada 2021 w Java przez Uczen12345 Obywatel (1,800 p.)
0 głosów
1 odpowiedź 500 wizyt
pytanie zadane 19 kwietnia 2020 w Java przez Avalansz Użytkownik (580 p.)
0 głosów
2 odpowiedzi 934 wizyt
pytanie zadane 17 maja 2022 w Java przez Arek Kowalski Początkujący (450 p.)

93,626 zapytań

142,549 odpowiedzi

323,034 komentarzy

63,129 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1452p. - dia-Chann
  2. 1317p. - DziarnowskiJ
  3. 1292p. - Łukasz Piwowar
  4. 1291p. - CC PL
  5. 1254p. - raydeal
  6. 1219p. - robwarsz
  7. 1161p. - Maurycy W
  8. 1141p. - ssynowiec
  9. 1141p. - Adrian Wieprzkowicz
  10. 1134p. - Tomasz Bielak
  11. 1116p. - rucin93
  12. 1100p. - Mariusz Fornal
  13. 885p. - Dominik Łempicki (kapitan)
  14. 847p. - Grzegorz Aleksander Klementowski
  15. 838p. - Wojciech Malicki
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...