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

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:

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:

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

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

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:

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

0
komis.getOrDefault(klucz, new ArrayList<Samochod>()).add(car);
0
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.

1

Źle napisałem

ArrayList<Samochod> cars = komis.getOrDefault(model, new ArrayList<Samochod>());
cars.add(s);
komis.put(model, cars); 
0

Możesz wytłumaczyć co to jest?

HashMap<String, ArrayList<Samochod>> katalog

albo przynajmniej jak to działa :D

0

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

0
Zakręcony Kot napisał(a):

Możesz wytłumaczyć co to jest?

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 ?

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:

model = car.getModel();
cars = komis.getOrDefault(model, new ArrayList<Samochod>());
cars.remove(car);
0

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

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();
	}
0

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

 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.

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

1

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

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

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).

komis.get(marka).remove(index - 1); 
0

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

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