Problem z HashMap <String , ArrayList<Object>> - dodawanie/usuwanie wartości istniejącego klucza

Problem z HashMap <String , ArrayList<Object>> - dodawanie/usuwanie wartości istniejącego klucza
Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Witam, mam problem przy programie, który muszę zrobić na zajęcia z Javy. Konkretnie:
W poleceniu dostałem do zrobienia klasę samochód:

Kopiuj
public class Samochod 
{
	private String marka;
	private String model;
	private int rocznik;
	private int cena;
	
	public Samochod(String marka, String model, int rocznik, int cena)
	{
		this.marka = marka;
		this.model  = model;
		this.rocznik = rocznik;
		this.cena = cena;
	}
	
	@Override
	public String toString()
	{
		return "\n" + marka + " " + model+ " rok: " + rocznik + " cena: " + cena + "PLN";
	}
}

Oraz klasę Komis, która ma zawierać prywatne pole:

Kopiuj
private HashMap<String, ArrayList<Samochod>> komis;

Cała klasa wygląda następująco:

Kopiuj
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Komis
{
	private HashMap<String, ArrayList<Samochod>> komis;
	
	public Komis(HashMap<String, ArrayList<Samochod>> komis)
	{
		this.komis = komis;
	}

	public void znajdzPoMarce(HashMap<String, ArrayList<Samochod>> katalog)
	{
		Scanner odczyt = new Scanner(System.in);
		String bufor;
		System.out.println("Podaj Markę do wyszukania:");
		bufor = odczyt.nextLine();
		if(katalog.get(bufor)!=null)
		{
			System.out.println(bufor+":");
			System.out.println(katalog.get(bufor));
		}
		else
		{
			System.out.println("Brak samochodów do wyświetlenia");
		}
		odczyt.close();
	}
	
	public void dodajSamochod()
	{
		
	}
	
	public void kupSamochod()
	{
		
	}
}

natomiast Main:

Kopiuj
public static void main(String[] args)
	{
		Samochod s1 = new Samochod("Opel", "Astra", 1999, 6000);
		Samochod s2 = new Samochod("Opel", "Vectra", 2006, 16000);
		Samochod s3 = new Samochod("Audi", "A3", 2008, 26000);
		Samochod s4 = new Samochod("Audi", "S4", 2011, 107000);
		Samochod s5 = new Samochod("Ford", "Focus", 2000, 4000);
		Samochod s6 = new Samochod("Ford", "Fiesta", 2004, 10000);
		
		ArrayList<Samochod> opel = new ArrayList<Samochod>();
		opel.add(s1);
		opel.add(s2);
		ArrayList<Samochod> audi = new ArrayList<Samochod>();
		audi.add(s3);
		audi.add(s4);
		ArrayList<Samochod> ford = new ArrayList<Samochod>();
		ford.add(s5);
		ford.add(s6);

		
		HashMap<String, ArrayList<Samochod>> katalog = new HashMap<String, ArrayList<Samochod>>();
		katalog.put("Opel", opel);
		katalog.put("Audi", audi);
		katalog.put("Ford", ford);
		
		Komis komis = new Komis(katalog);
		//komis.znajdzPoMarce(katalog);	
	}

Do rzeczy. Program ma działać w pętli do...while do momentu aż użytkownik nie naciśnie klawisza 0 i ma dawać możliwość dodawania, usuwania (kupowania samochodu) oraz wyszukiwania wszystkich pojazdów danej marki. całość zrealizuję za pomocą instrukcji switch, lecz problem polega na tym, że nie potrafię sobie poradzić ze stworzeniem funkcji dodania pojazdu oraz jego usunięciu. Domyślam się, że jeżeli klucz (marka) istnieje już w HashMapie to trzeba dodać nowy samochód do listy z tym samym kluczem, a gdy klucz nie istnieje należy stwożyć nową ArrayListę, lecz kompletnie nie wiem jak to zrealizować. Serdecznie proszę o pomoc i z góry dziękuję. Pozdrawiam

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
komis.getOrDefault(klucz, new ArrayList<Samochod>()).add(car);
Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0
Kopiuj
public void dodajSamochod(HashMap<String, ArrayList<Samochod>> katalog)
	{
		Scanner odczyt = new Scanner(System.in);
		String marka;
		String model;
		int rocznik;
		int cena;
		System.out.println("Podaj markę samochodu:");
		marka = odczyt.nextLine();
		System.out.println("Podaj model samochodu:");
		model = odczyt.nextLine();
		System.out.println("Podaj rocznik samochodu:");
		rocznik = odczyt.nextInt();
		System.out.println("Podaj cenę samochodu:");
		cena = odczyt.nextInt();
		
		Samochod s = new Samochod (model, marka, rocznik, cena);
		komis.getOrDefault(model, new ArrayList<Samochod>()).add(s);
		odczyt.close();
	}

Czy to powinno być coś takiego ? Nadal nie dodaje do mapy.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
1

Źle napisałem

Kopiuj
ArrayList<Samochod> cars = komis.getOrDefault(model, new ArrayList<Samochod>());
cars.add(s);
komis.put(model, cars); 
  • Rejestracja: dni
  • Ostatnio: dni
0

Możesz wytłumaczyć co to jest?

Kopiuj
HashMap<String, ArrayList<Samochod>> katalog

albo przynajmniej jak to działa :D

Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Dziękuję pięknie! działa dokładnie tak jak powinno! Mógłbym prosić jeszcze o wskazówkę jak usunąć wybraną wartość ?

Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0
Zakręcony Kot napisał(a):

Możesz wytłumaczyć co to jest?

Kopiuj
HashMap<String, ArrayList<Samochod>> katalog

albo przynajmniej jak to działa :D

Sorki jeżeli coś pokręcę ale jestem początkującym "programistą". Ja rozumiem to tak:
Jest to mapa (czyli zawiera pole klucz i wartość) ale żeby do jednego klucza mogło być wiele wartości użyłem ArrayList<Samochod> (czyli listę typu Samochód zawierającą pola tej klasy).
Ja wyobrażam sobie to zawsze jako taki "słownik" który zawiera klucz, taki unikalny identyfikator oraz wartość, czyli odnosząc się do tego "słownika" definicję tego klucza. (w moim przypadku kilka definicji). Chodziło o to, żeby pod kluczem np "Opel" znajdowała się lista samochodów właśnie spod tej marki.

Wracając do wątku, mógłbym prosić o jakąś wskazówkę co do usuwania tych wartości ?

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
1

Myślę, że powinieneś wyświetlić wszystkie samochody i spytać użytkownika, który chce usunąć. Najlepiej dwuetapowo, najpierw spytać o model, a potem wyświetlić samochody wybranego modelu. Jeśli chcesz usuwać wg własnego widzimisię, to jakoś tak:

Kopiuj
model = car.getModel();
cars = komis.getOrDefault(model, new ArrayList<Samochod>());
cars.remove(car);
Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Trochę się pospieszyłem, nie dodawałem pojazdu który usuwałem. Jednak nie usuwa :/

Kopiuj
public void usunSamochod(HashMap<String, ArrayList<Samochod>> katalog)
	{
		Scanner odczyt = new Scanner(System.in);
		String marka;
		String model;
		int rocznik;
		int cena;
		System.out.println("Podaj markę samochodu:");
		marka = odczyt.nextLine();
		System.out.println(katalog.get(marka));
		System.out.println("Podaj model samochodu:");
		model = odczyt.nextLine();
		System.out.println("Podaj rocznik samochodu:");
		rocznik = odczyt.nextInt();
		System.out.println("Podaj cenę samochodu:");
		cena = odczyt.nextInt();
		Samochod s = new Samochod (marka, model, rocznik, cena);
		ArrayList<Samochod> temp = katalog.getOrDefault(marka, new ArrayList<Samochod>());
		temp.remove(s);
		odczyt.close();
	}
bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Przecież próbujesz usuwać z katalogu inny samochód niż ten, który do niego dodałeś. Dopisz do klasy Samochod metodę

Kopiuj
 public boolean equals(Samochod other){
    return marka.equalsIgnoreCase(other.marka) && model.equalsIgnoreCase(other.model) && rocznik == other.rocznik && cena == other.cena;
}

Twoje podejście do usuwania jest złe, użytkownik pytany o markę, model, rocznik i cenę musi podać takie same dane jak podał podczas dodawania samochodu.

Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Dopisałem tą metodę, niestety nadal nie potrafię sobie poradzić z problemem. Wydaje mi się, że powinienem porównać np markę wpisaną, z marką w mojej liście i jeżeli istnieje, wtedy ją usunąć, lecz nie wiem jak się za to zabrać na powyższym przykładzie. Najwygodniej było by dla mnie wpisać markę pojazdu, wyświetlić listę i usuwać po indeksie ale nie wiem jak to zrobić.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
1

Wpierw wypisz dostępne marki w takiej mniej więcej formie:

Kopiuj
1. Audi
2. Ford
3. Opel 
...

i spytaj użytkownika o numer marki. Na podstawie podanego numeru ustal wartość zmiennej marka Potem wypisz wszystkie samochody danej marki

Kopiuj
int i = 1;
for(Samochod car: komis.get(marka))
{
    System.out.println(i + ". " + car);
    i++;
}

Spytaj użytkownika o numer samochodu do usunięcia (zmienna index).

Kopiuj
komis.get(marka).remove(index - 1); 
Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Teraz wszystko działa jak należy. Dziękuję pięknie za pomoc :)

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.