• 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

Object Storage Arubacloud
0 głosów
395 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 459 wizyt
pytanie zadane 26 października 2017 w Java przez kosaa Stary wyjadacz (14,130 p.)
0 głosów
1 odpowiedź 238 wizyt
pytanie zadane 19 lutego 2019 w Java przez must Bywalec (2,980 p.)
0 głosów
1 odpowiedź 686 wizyt

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...