Search in ArrayList<T>?

membersound

Bekanntes Mitglied
Hallo,

ich versuche gerade eine Suche für meine generische ArrayList zu schreiben.
Mein Model enthält die ArrayList mit allen Objekten. Jedes Objekt hat zB das Attribut String name.
Wenn ich jetzt nach dem Namen suchen möchte, kann ich es zB so machen:

Java:
        for (int i = 0; i < myModel.getArrayList().size(); i++) {
            System.out.println(myModel.getArrayList().get(i).getName().contains("Hans"));
        }

Aber ist das wirklich der gängige Weg? Geht das nicht noch besser?

Danke
 
G

Gast2

Gast
Willst du wirklich suchen (gib mir Index für Datensatz XY) oder willst du die Liste filtern (gib mir alle Datensätze mit Ausprägung XY)?
 

pl4gu33

Top Contributor
mm also wenn du wirklich nen Objekt in der Liste hast wird dir nichts anderes überbleiben, als einmal durchzugehen und die Attribute zu holen... zumindest fällt mir gerade nix ein^^,... wenn du die Strings direkt in dem Array hast könntest du sie mit Contains von der ArrayListe Vergleichen....
 
Zuletzt bearbeitet:
B

bygones

Gast
ist dein problem einfach obs anders geht oder dass es eine generische Liste ist ?

im 2. Fall brauchst du ein gemeinsames Interfaces welches die getName() Methode hat, die Liste verwendet dann dieses Interface.

im 1. Fall fehlt (siehe Eikes Post) etwas der Kontext
 

membersound

Bekanntes Mitglied
Also die generische Liste ist fix. Da möchte ich glaub ich nichts mehr ändern, das wär aufwendig.

Ich möchte alle Indexe der Objekte, welche zB im Namen "Hans" stehen haben.
Den Index hätte ich ja durch die for-Schleife bereits in i, also immer dann wenn der Suchausdruck true ist.

Meine Frage ist eben, ob es anders/besser/eleganter geht als mit dieser for-schleife.
Magst du noch was auf die von dir genannte Vorgehensweise mit dem Interface schreiben?


Die ArrayList<MyObject> sammelt alle Objekte mit .add(new MyObject),
die Objekte selbst beinhalten verschiedene Fields wie "string name".
 
Zuletzt bearbeitet:

pl4gu33

Top Contributor
Die ArrayList<MyObject> sammelt alle Objekte mit .add(new MyObject),
die Objekte selbst beinhalten verschiedene Fields wie "string name".

ich glaub da bleibt dir keine andere Wahl, als jeden einzeln zu vergleichen .... wenn die Attribute direkt in der Liste wären, könntest du mit indexOf(String Name) arbeiten .... aber da wär auch die Frage, wieviele des gleichen Strings drin sein könnten
 
G

Gast2

Gast
Naja, ne for-Schleife brauchst du schon, du musst ja alle Datensätze mind. einmal beleuchten. Aber man kann das ganze natürlich etwas "eleganter" verpacken:

Java:
public abstract class ListFilter<T> {
	/**
	 * Returns true if t matches this filter.
	 */
	public abstract boolean matches(T t);
	
	public final List<T> filterList(List<T> list) {
		List<T> filteredList = new ArrayList<T>();
		
		for (T t : list) {
			if (this.matches(t)) {
				filteredList.add(t);
			}
		}
		
		return filteredList;
	}	
}

Java:
	public static void main(String[] args) {
		List<Person> persons = new ArrayList<Person>();
		persons.add(new Person("Hans"));
		persons.add(new Person("Holger"));
		persons.add(new Person("Hansi"));
		persons.add(new Person("Max"));

		ListFilter<Person> nameFilter = new ListFilter<Person>() {
			@Override
			public boolean matches(Person p) {
				return p.getVorname().contains("Hans");
			}
		};
		
		System.out.println(nameFilter.filterList(persons));
	}

Java:
public class Person {
	private String vorname;
	
	public Person(String vorname) {
		this.vorname = vorname;
	}
	
	public String getVorname() {
		return vorname;
	}
	
	@Override
	public String toString() {
		return vorname;
	}
}
 
B

bygones

Gast
bin mir nicht sicher was du mit generischen Liste meinst bzw so nutzt wie ich es verwenden wuerde.

Stehen in deiner Liste nur Objekte von der gleichen Klasse ? oder redest du explizit von [c]List<T>[/c] ?

im Grunde erstmal egal - Eikes Vorschlag ist sehr gut - nimm den :)
 

membersound

Bekanntes Mitglied
Ja, in der ArrayList stehen nur Objekte von der gleichen Klasse (bzw deren Kindklassen).

Danke Eike, so in etwa hab ich mir das gedacht :toll:

Zumal ich auch irgendwann verschiedene Filter einbauen möchte, für forename, surname usw. Das kann ich hiermit ja prima adaptieren.
 

Ähnliche Java Themen

Neue Themen


Oben