Przeszukiwanie ArrayList po dowolnym parametrze

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

class Klient {
	private String Imie = null;
	private String Nazwisko = null;
	private int Wiek = 0;

	public Klient(String Imie, String Nazwisko, int Wiek) {
		this.Imie = Imie;
		this.Nazwisko = Nazwisko;
		this.Wiek = Wiek;
	}

	public String getImie() {
		return Imie;
	}

	public void setImie(String imie) {
		Imie = imie;
	}

	public String getNazwisko() {
		return Nazwisko;
	}

	public void setNazwisko(String nazwisko) {
		Nazwisko = nazwisko;
	}

	public int getWiek() {
		return Wiek;
	}

	public void setWiek(int wiek) {
		Wiek = wiek;
	}

}

public class Przeszukiwanie {

	public static void main(String[] args) {

		List<Klient> lista = new ArrayList<Klient>();
		Klient klient1 = new Klient("Jan", "Kowalski", 19);
		Klient klient2 = new Klient("Marek", "Kaminski", 23);
		Klient klient3 = new Klient("Jan", "Majewski", 30);
		lista.add(klient1);
		lista.add(klient2);
		lista.add(klient3);

	}
}

Chciałbym prosić o pomoc przy napisaniu funkcji która będzie przeszukiwała tą listę po dowolnym parametrze np. jak podam String "Majewski" jako parametr zwróci mi referencje do tego elementu w tej liście. Lub do wszystkich innych elementów gdzie występuje szukany wyraz. Tak samo jeśli chodzi o imię i wiek. Dziękuję z góry za wszelkie wskazówki i pomoc.

1

Ale z czym masz problem?
Tworzysz 3 metody (najlepiej w odrębnej klasie), które są odpowiedzialne za obsługę listy. Metody przyjmują odpowiednie parametry i w zależności od tego, co podał użytkownik, są wybierane. Inaczej mówiąc - robisz 3 metody o tej samej nazwie i różnych parametrach (przeciążasz).
Np.:

public Klient znajdzKlienta(String nazwisko){ 
    ...
    for(...)
        if(list[i].getNazwisko.equals(nazwisko))
              return list[i];
}

Potem metodzie znajdzKlienta dajesz nowy parametr i podobnie wyszukujesz.

0

Allocer dzięki. Niby proste i powinienem załapać, ale widzisz jeszcze muszę się tyle nauczyć.

Ale jedna rzecz nie daje mi spokoju. Trzy metody przeładowane i każda przyjmuje jeden parametr i szuka po odpowiednim getterze. Ale tutaj mamy dwa Stringi. Jeden na nazwisko a drugi na imię. Nie mogą być dwie metody przeładowane z tym samym parametrem typu string.

0

Możesz użyć osobnego interfejsu do wyciągania zawartości pola, np:

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

class Klient {

    private String Imie = null;
    private String Nazwisko = null;
    private int Wiek = 0;

    public Klient(String Imie, String Nazwisko, int Wiek) {
        this.Imie = Imie;
        this.Nazwisko = Nazwisko;
        this.Wiek = Wiek;
    }

    public String getImie() {
        return Imie;
    }

    public void setImie(String imie) {
        Imie = imie;
    }

    public String getNazwisko() {
        return Nazwisko;
    }

    public void setNazwisko(String nazwisko) {
        Nazwisko = nazwisko;
    }

    public int getWiek() {
        return Wiek;
    }

    public void setWiek(int wiek) {
        Wiek = wiek;
    }
}

interface Getter<Typ, Pole> {

    Pole get(Typ obiekt);
}

public class Przeszukiwanie {

    static <Typ, Pole> Typ wybierz(final List<Typ> lista, 
            final Getter<Typ, Pole> getter, final Pole szukane) {
        for (final Typ obiekt : lista) {
            if (szukane.equals(getter.get(obiekt))) {
                return obiekt;
            }
        }
        return null;
    }
    
    static class ImieGetter implements Getter<Klient, String> {
        public String get(Klient obiekt) {
            return obiekt.getImie();
        }
    }

    public static void main(final String[] args) {

        final List<Klient> lista = new ArrayList<Klient>();
        Klient klient1 = new Klient("Jan", "Kowalski", 19);
        Klient klient2 = new Klient("Marek", "Kaminski", 23);
        Klient klient3 = new Klient("Jan", "Majewski", 30);
        lista.add(klient1);
        lista.add(klient2);
        lista.add(klient3);
        Klient szukany1 = wybierz(lista, new Getter<Klient, String>() {

            public String get(Klient obiekt) {
                return obiekt.getNazwisko();
            }
        }, "Kaminski");
        System.out.println("Klient: " + szukany1.getImie() 
                + ", " + szukany1.getNazwisko());
        Klient szukany2 = wybierz(lista, new ImieGetter(), "Marek");
        System.out.println("Klient: " + szukany2.getImie()
                + ", " + szukany2.getNazwisko());
    }
}

Być może w tym przypadku byłoby to strzelaniem z armaty do muchy.

Ponadto zawsze możesz posłużyć się refleksją, z tym, że refleksja jest trochę wolna.

0
Goenitz napisał(a):

Allocer dzięki. Niby proste i powinienem załapać, ale widzisz jeszcze muszę się tyle nauczyć.

Ale jedna rzecz nie daje mi spokoju. Trzy metody przeładowane i każda przyjmuje jeden parametr i szuka po odpowiednim getterze. Ale tutaj mamy dwa Stringi. Jeden na nazwisko a drugi na imię. Nie mogą być dwie metody przeładowane z tym samym parametrem typu string.

Sprostuję bo nieprecyzyjnie się wyraziłem, albo zbyt skróciłem tok rozumowania.

Chodzi o to, że kiedy masz dwie metody i każda z nich zwraca ten sam typ danych oraz przyjmuje, jako argument ten sam typ, to możesz albo zastosować w jednej z nich domyślny parametr, który zawsze będzie ignorowany, albo (o czym wspomniał Wibowit) posłużyć się systemem refleksji. Co do refleksji to sens jej użycia nie jest tu konieczny.
Zawsze masz wyjście, żeby stworzyć zupełnie trzy osobne metody i wtedy powyższy problem znika ;).

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