obsługa Hashmapy

obsługa Hashmapy
kuba1990
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 lat
  • Postów:39
0

w metodzie main wywołuje sobie 2 razy tą samą metode: placeInTrain. Do zapisu danych używam hashmapy.
jak zrobić, żeby hashmapa nie tworzyła mi się od nowa za każdym razem wywołania metody, tylko sumowała wynik?

https://paste.ofcode.org/hzbhjxZ8cq3LUQRQ7BtKU

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

W kodzie którzy podałeś mapa jest tylko jedna i wywołanie metody wcale nie tworzy nowej.
To co robisz w tym kodzie to jest ciężki #rakcontent niemniej problem który opisałeś w ogóle nie występuje. Napisz może łaskawie co chciałeś osiągnąć i co się dzieje.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
W0
No bez przesady, w porównaniu z tym co się tutaj widywało to nie jest wcale źle :)
kuba1990
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 lat
  • Postów:39
0

@Shalom: chciałem żeby za każdym wywołaniem metody, hashmapa się aktualizowała tzn. sumowała wynik. Teraz wyniki się nadpisują.
Po wykoniu pierwszej metody mapa powinna wygląć tak: (1;20,2;20,3;20,4;20,5;20), po drugim( 1;35, 2;35,3;45,4;35,5;35)

W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 3 godziny
  • Postów:3584
1

Możesz użyć Map.compute.

Działa to następująco:

Kopiuj
	Map<Integer, Integer> map = new HashMap<>();
	map.put(1, 10); 

	int increment = 15;

	// Chcemy, żeby jeśli klucza nie ma to wstawiał 15, jeśli jest to niech dodaje 15.
	for(int i=1; i<=2; i++){
		map.compute(i, (key, value) -> increment + (value == null ? 0:value));
	}

	System.out.println(map.get(1)); // Daje 25
	System.out.println(map.get(2)); // Daje 15

EDIT:
Zgodnie z tym co napisał @jarekr000000 można użyć Map.merge. Zaletą jest brak null-checka.

Kopiuj
	Map<Integer, Integer> map = new HashMap<>();
	map.put(1, 10);

	int defaultValue = 15;
	for(int i=1; i<=2; i++){
		map.merge(i, defaultValue, (prevValue, newValue) -> prevValue + newValue);
	}

	System.out.println(map.get(1)); // Daje 25
	System.out.println(map.get(2)); // Daje 15
edytowany 4x, ostatnio: wartek01
jarekr000000
Tu, zamiast compute, lepiej pasuje merge.
W0
Sprawdziłem, i nie jestem przekonany. Zamieniając: compute na "map.merge(i, increment, (key, value) -> increment + value)" dostaniesz 30 i 15, a mi o to nie chodziło.
jarekr000000
@wartek01: bo pomieszałeś parametry. Tam nie ma być key, value ->
W0
Fakt, to powinno być (prevValue, newValue)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

o_O wkładasz do mapy nowe dane przez put to co się dziwisz że się "nadpisuja"? Myślisz trochę nad tym co robisz? Mapa ma takie rzeczy jak choćby putIfAbsent albo getOrDefault. Logika nakazywałaby że:

  • pobierasz z mapy aktualną wartość
  • wyliczasz nową
  • wkładasz do mapy nową wartość
    Nie trzeba już nawet kombinować tak jak kiedyś i sprawdzać czy w mapie jest juz dany klucz bo wystarczy ci getOrDefault gdzie możesz zwrócić 0 jeśli klucza w mapie jeszcze nie było.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.