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

question-closed Nie dodaje do listy typu String

Object Storage Arubacloud
0 głosów
114 wizyt
pytanie zadane 28 czerwca 2017 w Java przez niezalogowany
zamknięte 17 kwietnia 2018

W ramach treningu programowania obiektowego postanowiłem napisać program i wszystko poszło bardzo dobrze, lecz nie zapisuje mi result'a (wyniku ze scannera) do listy przez co nie mogę tego ani usunąć, ani sprawdzić jego statusu :) Nie mam pomysłu dlaczego tak się dzieje, więc zwracam się o pomoc.

import java.util.Scanner;

public class Main 
{
	public static void main(String args[]) {
		
		System.out.println("welcome message");
		while (true) {
			@SuppressWarnings("resource") // for scanner 
			Scanner scanner = new Scanner(System.in);
			Animal animal = new Animal();
			String result = scanner.nextLine();
			
			if(result.equalsIgnoreCase("status")) {
				statusCommand();
			} else if(result.equalsIgnoreCase("add")) {
				animal.addAnimal();
			} else if(result.equalsIgnoreCase("remove")) {
				animal.removeAnimal();
			}
		}
		
	}
	
	public static void statusCommand() {
		Shelter shelter = new Shelter();
		
		System.out.println("Aktualnie w schronisku posiadamy " + shelter.getAnimals().size() + "/" + shelter.capacity + " zwierząt.");
		if(shelter.getCapacity() <= shelter.capacity) {
			System.out.println("Posiadamy jeszcze wolne miejsca!");
		} else {
			System.out.println("Nie mamy już wolnych miejsc!");
		}
	}
}

 

import java.util.List;
import java.util.Scanner;

public class Animal 
{
	String name;
	
	Scanner scanner = new Scanner(System.in);
	Shelter shelter = new Shelter();
	List<String> animals = shelter.getAnimals();
	
	public void addAnimal() {		
		System.out.println("Podaj imię swojego zwierzaka: ");
		String result = scanner.nextLine();
		this.name = result;
		
		if(animals.contains(name)) {
			System.out.println("Taki zwierzak juz istnieje!");
		} else if(animals.size() <= shelter.capacity) {
			animals.add(name); 
			System.out.println("Pomyslnie utworzono zwierzaka o imieniu " + result);
		} else {
			System.out.println("Schronisko jest już pełne!");
		}
	}
	
	public void removeAnimal() {	
		System.out.println("Podaj imię swojego zwierzaka: ");
		String result = scanner.nextLine();
		name = result;
		
		if(!animals.contains(name)) {
			System.out.println("Nie posiadamy takiego zwierzaka!");
		} else {
			animals.remove(name);
			System.out.println("Pomyslnie usunieto zwierzaka o imieniu " + result);
		}
	}
	
}

 


import java.util.ArrayList;
import java.util.List;

public class Shelter 
{
	public int capacity;
	public List<String> animals = new ArrayList<>();
	
	public Shelter() { 
		capacity = 10;
	}

	public int getCapacity() {
		return capacity;
	}

	public List<String> getAnimals() {
		return this.animals;
	}
}

 

komentarz zamknięcia: Xxxxxx

1 odpowiedź

0 głosów
odpowiedź 28 czerwca 2017 przez Buby Pasjonat (19,590 p.)
wybrane 28 czerwca 2017
 
Najlepsza

Hej smiley Już tłumaczę w czym leży problem. Ogólnie w Twoim kodzie zmieniłbym kilka rzeczy - poniżej wytłumaczę co i dlaczego.

Od czego rozpocznę? Widzisz, Twój result poprawnie się zapisuje, lecz każdy zapis ma miejsce w innym obiekcie - zapis new Shelter() tworzy za każdym razem nowy obiekt, odmienny od reszty. Ty powinieneś posiadać jedno schronisko, które np. stworzysz w funkcji main, i będziesz je przekazywał do konstruktorów zwierząt. Uważam jednak, że to schronisko powinno posiadać metody addAnimal() i removeAnimal(). Pozwoliłoby to uniknąć przekazywania obiektu schroniska do konstruktora i byłoby bardziej logiczne.

Niemniej, pozostanę przy Twoim pomyśle i zostawię te metody w klasie Animal. Ważne jednak, aby poprawić konstruktor tej klasy, tak aby przyjmował referencję do schroniska, w którym będzie przetrzymywane zwierze.

Ponadto, stworzenie obiektu Scanera umieściłbym poza pętlą while - aby nie tworzyć każdorazowo nowego skanera przy obrocie pętli - będzie to efektywniejsze. To samo tyczy się zwierzęcia - umieszczę jego konstruktor w instrukcji if, ponieważ jest jeden przypadek, gdzie tworzysz obiekt tego typu niepotrzebnie - w momencie wyświetlania statusu.

Metoda main:

import java.util.Scanner;
 
public class Main 
{
    public static void main(String args[]) {
         Shelter shelter = new Shelter(); //jedno schronisko dla wszystkich zwierzat
         
         @SuppressWarnings("resource") // for scanner 
          Scanner scanner = new Scanner(System.in); //jeden skaner, aby nie tworzyc nowych obiektow co obrot petli

        System.out.println("welcome message");
        while (true) {
            String result = scanner.nextLine();
             
            if(result.equalsIgnoreCase("status")) {
                statusCommand();
            } else if(result.equalsIgnoreCase("add")) {
                Animal animal = new Animal(shelter); //Kazde zwierze jest w tym samym schronisku
                animal.addAnimal();
            } else if(result.equalsIgnoreCase("remove")) {
               Animal animal = new Animal(shelter); 
               animal.removeAnimal();
            }
        }
         
    }
     
    public static void statusCommand() {         
        System.out.println("Aktualnie w schronisku posiadamy " + shelter.getAnimals().size() + "/" + shelter.capacity + " zwierząt.");
        if(shelter.getCapacity() <= shelter.capacity) {
            System.out.println("Posiadamy jeszcze wolne miejsca!");
        } else {
            System.out.println("Nie mamy już wolnych miejsc!");
        }
    }
}

Klasa Animal:

import java.util.List;
import java.util.Scanner;
 
public class Animal 
{
    String name;
     
    Scanner scanner = new Scanner(System.in);
    Shelter shelter;
    List<String> animals;
     
    public Animal(Shelter s) {
       shelter = s;
       animals = s.getAnimals();
    }

    public void addAnimal() {       
        System.out.println("Podaj imię swojego zwierzaka: ");
        String result = scanner.nextLine();
        this.name = result;
         
        if(animals.contains(name)) {
            System.out.println("Taki zwierzak juz istnieje!");
        } else if(animals.size() <= shelter.capacity) {
            animals.add(name); 
            System.out.println("Pomyslnie utworzono zwierzaka o imieniu " + result);
        } else {
            System.out.println("Schronisko jest już pełne!");
        }
    }
     
    public void removeAnimal() {    
        System.out.println("Podaj imię swojego zwierzaka: ");
        String result = scanner.nextLine();
        name = result;
         
        if(!animals.contains(name)) {
            System.out.println("Nie posiadamy takiego zwierzaka!");
        } else {
            animals.remove(name);
            System.out.println("Pomyslnie usunieto zwierzaka o imieniu " + result);
        }
    }
     
}

Można jeszcze poprawić kilka rzeczy, ale to tak na szybko, że odblokować Twój błąd. W razie pytań pisz.

Pozdrawiam! wink

1
komentarz 28 czerwca 2017 przez niezalogowany
Wielkie dzięki i również pozdrawiam :)

Podobne pytania

+1 głos
1 odpowiedź 129 wizyt
+1 głos
0 odpowiedzi 345 wizyt
pytanie zadane 3 kwietnia 2021 w C i C++ przez DzikieHarce Użytkownik (690 p.)
0 głosów
1 odpowiedź 415 wizyt
pytanie zadane 24 kwietnia 2019 w C# przez Vorczu Początkujący (390 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...