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

Odpowiedz Nowy wątek
2016-12-14 22:36
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

edytowany 1x, ostatnio: Arek Rosenstrauch, 2016-12-14 22:41

Pozostało 580 znaków

2016-12-14 22:49
0
komis.getOrDefault(klucz, new ArrayList<Samochod>()).add(car);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2016-12-14 22:55

Pozostało 580 znaków

2016-12-14 23:06
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.

Pozostało 580 znaków

2016-12-14 23:10
1

Źle napisałem

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

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2016-12-14 23:14
Zakręcony Kot
0

Możesz wytłumaczyć co to jest?

HashMap<String, ArrayList<Samochod>> katalog

albo przynajmniej jak to działa :D

Czego w tym nie rozumiesz? Dla każdego modelu samochodu (opisanego Stringiem) przechowujesz kolekcję samochodów tego właśnie modelu. - bogdans 2016-12-14 23:21

Pozostało 580 znaków

2016-12-14 23:20
0

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

Pozostało 580 znaków

2016-12-14 23:28
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 ?

edytowany 2x, ostatnio: Arek Rosenstrauch, 2016-12-14 23:35
Nie pokręciłeś - bogdans 2016-12-14 23:36

Pozostało 580 znaków

2016-12-14 23:35
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);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2016-12-15 00:02
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();
    }

Pozostało 580 znaków

2016-12-15 00:21
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2016-12-15 00:24

Pozostało 580 znaków

2016-12-15 07:23
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ć.

edytowany 3x, ostatnio: Arek Rosenstrauch, 2016-12-15 07:41

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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