Kasowanie elementu z bazy

0
import java.util.*; 

public class baza {

	private String imie;
	private String nazwisko;
	static Scanner load = new Scanner(System.in);
	static ArrayList<baza> lista = new ArrayList<baza>();

	baza(String imie, String nazwisko)
	{
		this.imie=imie;
		this.nazwisko=nazwisko;
		
	}
	
	
    static String podajImie()
	{
		System.out.print("Podaj imie ");
		String imie = load.nextLine();
		return imie;
	}
	
	static String podajNazwisko()

	{
		System.out.print("Podaj nazwisko ");
		String nazwisko = load.nextLine();
		return nazwisko;
	}

	static void usunObiekt()
	{		System.out.print("Podaj obiekt do usuniecia ");
			String usun = load.nextLine();
			
			for (int q=0; q<lista.size();q++) // !!!!!!!! Gdzieś Tu Jest Problem !!!!!!!!!!!!
				{
				if (lista.get(q).imie ==usun )
					{
					System.out.println("Poprawnie usunieto obiekt" + lista.get(q).imie + " "+lista.get(q).nazwisko);
					lista.remove(q);
					}
				}

	}

	public static void main(String[] args) {

		Scanner cin = new Scanner(System.in); //
		
		for (int i=0; i<3; i++)
		{
			baza lol = new baza(podajImie(), podajNazwisko());
			lista.add(lol);
		}
		
		usunObiekt();

		for(int q=0;q<lista.size();q++)
		{
			System.out.print(lista.get(q).imie+" ");
			System.out.println(lista.get(q).nazwisko);

		}

	}

}

Dlaczego po przeszukaniu if'em elementow z ArrayList obiekt nie chce sie usunąc?? Gdzie jest błąd?

0

Bo nie wolno usuwać z listy po której iterujesz w ten sposób. Przecież jak wyrzucisz element z listy to jej rozmiar się zmienia! Uzyj do tego iteratora.

1

Stringi porównuje się inaczej.

lista.get(q).imie.equals(usun)

Drugi problem opisał @Shalom, jeśli w kolekcji są np. trzy osoby o imieniu Bartosz, to którą ma usunąć: pierwszą, ostatnią, losową, wszystkie?Jeśli pierwszą, to iterator jest niepotrzebny, wystarczy break po usunięciu.

0

dzięki bogdans, gra i trąbi

import java.util.*; 

public class baza {

	private static String imie;
	private static String nazwisko;
	
	static String getImie()
	{
		return imie;
	}
	static String getNazwisko()
	{
		return nazwisko;
	}
	
	static Scanner load = new Scanner(System.in);
	static ArrayList<baza> lista = new ArrayList<baza>();

	baza(String imie, String nazwisko)
	{
		this.imie=imie;
		this.nazwisko=nazwisko;
		
	}
	
	
    static String podajImie()
	{
		System.out.print("Podaj imie ");
		String imie = load.nextLine();
		return imie;
	}
	
	static String podajNazwisko()

	{
		System.out.print("Podaj nazwisko ");
		String nazwisko = load.nextLine();
		return nazwisko;
	}

	static void usunObiekt()
	{		System.out.println("Podaj obiekt do usuniecia ");
			System.out.print("Podaj imie ");
			String usunImie = load.nextLine();
			System.out.print("Podaj nazwisko ");
			String usunNazwisko = load.nextLine();

			
			for (int q=0; q<lista.size();q++)
				{
				if (lista.get(q).imie.equals(usunImie) || lista.get(q).nazwisko.equals(usunNazwisko) )
					{
					System.out.println("Poprawnie usunieto obiekt " + lista.get(q).imie + " "+lista.get(q).nazwisko);
					lista.remove(q);
					}
				}
			
			

		
	}

	static boolean czyJestWBazie(String imie, String nazwisko)
	{	int w=0;
		for (int q=0; q<lista.size();q++)
		{
			if (lista.get(q).imie.equals(imie) && lista.get(q).nazwisko.equals(nazwisko) )
			{	
				w++;
				break;
			}
		
		}
		if (w==0)
		{
			return true;
		}
		else
		{
			return false;
		}
		
	
	}
	
	public static void main(String[] args) {

		Scanner cin = new Scanner(System.in); //OBIEKT DO ODEBRANIA DANYCH OD UŻYTKOWNIKA
		
		for (int i=0; i<3; i++)
		{
			baza lol = new baza(podajImie(),podajNazwisko());
			
			if(czyJestWBazie(getImie(),getNazwisko()))
			{
							lista.add(lol);
							System.out.println(" dodalem :)");
			}
			else
			{
				System.out.println("  niedodam :)");
			}
		}
		
		usunObiekt();
		
		
		
		
		for(int q=0;q<lista.size();q++)
		{
			System.out.print(lista.get(q).imie+" ");
			System.out.println(lista.get(q).nazwisko);

		}
		
		

	}

}

Kurcze nie dodaje mi obiektu, coś namieszalem prosze o rzucenie na to okiem :) cos sie psuje z funkcja czyJestWBazie();

0

Po co zwiększasz w?

                        if (lista.get(q).imie.equals(imie) && lista.get(q).nazwisko.equals(nazwisko) )
                        {        
                                w++;
                                break;
                        }

Krótsza wersja funkcji

static boolean czyJestWBazie(String imie, String nazwisko)
{
        for (int q=0; q<lista.size();q++)
        {
              if (lista.get(q).imie.equals(imie) && lista.get(q).nazwisko.equals(nazwisko) )
              {        
                     return true;
              }
        }
        return false;
}
0

Kurcze zmienilem tą funkcje na Twoją i nadal nie chce dodać..

0

A nie powinno być tak?

if(!czyJestWBazie(getImie(),getNazwisko()))
{
    lista.add(lol);
    System.out.println(" dodalem :)");
}
else
{
    System.out.println("  niedodam :)");
}
0

Nie dokońca działa, dodaje tylko 1 element. Poźniej juz żadnego. Zastanawiające:)

0

Nie, tak działa bo pola imie i nazwisko są static.
Za pierwszym razem (kolekcja jest pusta) dodaje do kolekcji np. osobnika Jan Chrzan, za drugim razem (kolekcja zawiera jedna osobę) próbujesz dodać osobniczkę Ewa Zdrzewa, pola są static, więc wywołanie

baza lol = new baza("Ewa","Zdrzewa");

zmienia wartość pola imie na z "Jan" na "Ewa", a pola nazwisko na z "Chrzan" na "Zdrzewa" => funkcja czyJestWBazie() zwraca true.

0

Hmm to co zmienić żeby dodawał po kolei z klawiatury imię i nazwisko? Static mi zasugerował Eclipse...

0

Takiego programu nie da się umieścić w jednej klasie, klasa baza może wyglądać tak:

class baza {
 
        private String imie;
        private String nazwisko;
 
        String getImie()
        {
                return imie;
        }
        String getNazwisko()
        {
                return nazwisko;
        }
 

 
        baza(String imie, String nazwisko)
        {
                this.imie=imie;
                this.nazwisko=nazwisko;
 
        } 
}

Resztę (odpowiednio zmienioną, np. imie => getImie(), wymaganych zmian jest więcej) umieść w klasie TestBazy.

0

@bogdans - dlaczego nie da się? Nie mówię, że to poprawne, ale jak zamienić:

z powrotem wszystko na public/private - statyczna zostaje tylko lista, do której dodajesz dane.

Scanner cin = new Scanner(System.in); //OBIEKT DO ODEBRANIA DANYCH OD UŻYTKOWNIKA
                
                baza lol = new baza();
 
                for (int i=0; i<3; i++)
                {
                        lol = new baza(lol.podajImie(), lol.podajNazwisko());
 
                        if(lol.czyJestWBazie(lol.getImie(),lol.getNazwisko()))
                        {
                                                        lista.add(lol);
                                                        System.out.println(" dodalem :)");
                        }
                        else
                        {
                                System.out.println("  niedodam :)");
                        }
                }
 
                lol.usunObiekt();

...
To działa. Na tym poziomie wszystko da się upakować do jednej klasy chyba ;)

Też się uczę, osobiście bym rozparcelowała na klasy, ale... to chyba nie tak, że się nie da?

0

wielkie dzięki :) bardzo pomogliście mi na początku mej drogi:D

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