• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java - Problem z dodawaniem obiektów HashSet

0 głosów
592 wizyt
pytanie zadane 16 czerwca 2017 w Java przez agigi1988 Nowicjusz (190 p.)

Witajcie,

mam problem z zadaniem z Javy i nie mogę zlokalizować problemu.

Użyłam kolekcji HashSet, poniżej Main i klasa Car:

Main:

https://pastebin.com/e44jEk0d

Car:

https://pastebin.com/WJ7zgRjd

 

Problem polega na tym, że jak pierwszy samochód wprowadzam to teoretycznie jest OK, później program pyta czy dodać kolejny samochód i pojawia się po wprowadzeniu, że już taki samochód został wprowadzony, mimo że jest wpisywany zupełnie różny. Natomiast jak chcę wyświetlić dodane samochody to pojawia się: Marka null, model null, nr VIN null.

Będę wdzięczna za pomoc.

2 odpowiedzi

0 głosów
odpowiedź 16 czerwca 2017 przez mitelak Pasjonat (23,330 p.)
wybrane 17 czerwca 2017 przez agigi1988
 
Najlepsza

Problem ten jest spowodowany tym

String marka = null;
String model = null;
String nrVin = null;

Car samochod = new Car(marka, model, nrVin);

że tworzysz sobie obiekt samochód i poszczególnym polom przypisujesz wartość null i później owszem pobierasz wartości, ale nie zmieniasz wartości pól w obiekcie tylko zmieniasz wartości tych zmiennych

System.out.println("Podaj marke");
marka = sc.next();
System.out.println("Podaj model");
model = sc.next();
System.out.println("Podaj nr vin");
nrVin = sc.next();

rozwiązaniem problemu jest, albo tworzenie obiektu samochód po pobraniu wartości do zmiennych czyli

Car samochod = new Car(marka, model, nrVin); 

robisz po pobraniu, albo zamiast pobierać wartości do zmiennych to od razu nadawać je obiektowi czyli

System.out.println("Podaj marke");
samochod.setMarka(sc.next());
System.out.println("Podaj model");
samochod.setModel(sc.next());
System.out.println("Podaj nr vin");
samochod.setNrVin(sc.next());

wtedy nie potrzebujesz nawet tych zmiennych marka/model/nrVim 

komentarz 16 czerwca 2017 przez agigi1988 Nowicjusz (190 p.)
Wszystko działa i rozumiem swój błąd teraz :) Dziękuję Wam za pomoc!
0 głosów
odpowiedź 16 czerwca 2017 przez Wildee Gaduła (3,380 p.)

Problem leży w klasie Main. Za wcześnie wywołujesz konstruktor. W 22 linijce tworzysz obiekt Car o nazwie samochod i dodajesz do niego wartości null. Konstruktor powinnaś wywołać po wpisaniu zmiennych, takich jak model, marka czy nrVin (czyli po 33. linijce). Podaje działający kod, więc możesz porównać ze swoim. I jeszcze jedno. Dobrze zrobiłaś, kiedy przy deklaracji obiektu HashSet podałaś, jakie obiekty powinien przetrzymywać. Powinnaś jednak jeszcze raz to określić przy tworzeniu obiektu. Dla jasności, mam na myśli, abyś robiła tak: HashSet<Car> samochody = new HashSet<Car>();, a nie tak HashSet<Car> samochody = new HashSet<>();

import java.util.HashSet;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        HashSet<Car> samochody = new HashSet<Car>();
        Scanner sc = new Scanner(System.in);
        boolean wybor3 = true;
 
        do {
            System.out.println("Wybierz co chcesz zrobić: ");
            System.out.println("1. Wprowadzanie nowego samochodu.");
            System.out.println("2. Wyświetlanie samochodów znajdujacych się w bazie.");
            System.out.println("3. Zakończ.");
 
            String marka = null;
            String model = null;
            String nrVin = null;
           
           
            int wybor = sc.nextInt();
            switch (wybor) {
            case 1:
                System.out.println("WPROWADZANIE NOWEGO SAMOCHODU");
                System.out.println("Podaj marke");
                marka = sc.next();
                System.out.println("Podaj model");
                model = sc.next();
                System.out.println("Podaj nr vin");
                nrVin = sc.next();
                Car samochod = new Car(marka, model, nrVin);
                if (samochody.contains(samochod)) {
                    System.out.println("Podana marka wystepuje w bazie. ");
                }
                else {
                	samochody.add(samochod);
                }
                
                break;
            case 2:
                for (Car s : samochody) {
                    System.out.println(s);
                }
                break;
            case 3:
                System.out.println("Koniec programu.");
                System.exit(0);
                break;
            default:
                System.out.println("Takiej opcji nie ma w menu. Wybierz inną. ");
            }
           
        } while (wybor3 == true);
        sc.close();
        System.out.println("Koniec programu.");
    }
}

 

1
komentarz 16 czerwca 2017 przez mitelak Pasjonat (23,330 p.)

HashSet<Car> samochody = new HashSet<Car>();

to dokładnie to samo co 

HashSet<Car> samochody = new HashSet<>();

Bo kompilator określa typ na podstawie lewego wyrażenia, więc niepodawanie typu drugi raz jest całkowicie normalne wink

komentarz 17 czerwca 2017 przez Wildee Gaduła (3,380 p.)
Racja. Dla mnie to po prostu kwestia przyzwyczajenia i czytelności ;P

Podobne pytania

0 głosów
0 odpowiedzi 670 wizyt
pytanie zadane 26 października 2017 w Java przez kosaa Stary wyjadacz (14,130 p.)
0 głosów
1 odpowiedź 338 wizyt
pytanie zadane 19 lutego 2019 w Java przez must Bywalec (2,980 p.)
0 głosów
1 odpowiedź 844 wizyt

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 pasjonatów

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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...