# ArrayList Objekte anhand Propertywerte filtern



## joekey (2. Aug 2009)

Hallo,

ich häte folgendes Problem. Ich habe eine menge der Objekte in einer ArrayList gespeichert. Ich habe vor eine Methode zu schreiben, die diese Objekte anhand gewisser Kriterien filtert und als neues ArrayList zurückliefert. 

public ArrayList filter(String property, String eqSign, String value)

property: Feldname
eqSign: ==  >  <  !=
value: der Wert des Feldes

Wie könnte ich diese Aufgabe eingehen? Gibt es bereit Klassen oder Methoden die oben genanntes ermöglichen?
Die Objekte in der ArrayList können andere Objekte enthalten und diese sollen auch mitvalidiert.

Danke für die Hinweise

LG Joe


----------



## Schandro (2. Aug 2009)

Mach in der Methode ne neue ArrayList und geh mit ner foreach-Schleife über die Original-Liste drüber und guck bei jedem Element ob es deinem Kriterien entspricht. Wenn ja, wird dieses Element der neuen ArrayList hinzugefügt. Nach der Schleife returnts du die neue ArrayList.



> Die Objekte in der ArrayList können andere Objekte enthalten und diese sollen auch mitvalidiert.


???:L Was meinst du damit?


----------



## joekey (2. Aug 2009)

Hallo,

ja die Methode habe ich bereit so wie du es beschrieben hast. Wie erstelle ich aber die Zeile mit der Validierung? Gibt es in java ein eval(String) Konstrukt?

zB. 
for each element of ArrayList...
*if (eval(property+eqSign+value)*
add element in new array

Leider habe ich nicht eine Zielführende Methode bis jetzt gefunden.

Danke

LG JOe


----------



## joekey (27. Aug 2009)

Hallo,

ich bin leider noch immer nich weitergekommen. Ich habe jetzt ein kleines Beispiel zusammengestellt:

Es gibt 3 Klassen - test(main), Country und Currency vobei die Country die currency in sich als Attribut speichert. Wenn man das Programm ausführt bekommt man folgende Ausgabe: 
USA	 USD	 100
DE	 EUR	 20
JAP	 JPY	 2000

So weit so gut.

Meine Frage bzw. Problem: Ich suche nach einer Möglilchkeit nach den Attributen der Klasse Country zu suchen und zwar auch in den anderen in Contry Klasse enthaltenen Klassen (also Currency).

Es soll eine Methode (zb in einer neune Finder Klasse) FilterByField(String FieldName, String eqSign, String Value).
Aufruf1: FilterByField("Country.name", "==", "USA")
Aufruf2: FilterByField("Currency.name", "==", "JPY")
Aufruf3: FilterByField("Country.amount", "<", "1000")

Glaubt ihr das es machbar wäre? Kann mir da jemand weiter helfen?

:bahnhof:

danke


```
package test;

public class Country {

	private String name;
	private Currency curr;
	private Integer amount;
	
	public Country(String name, String curr, int amount) {
		// TODO Auto-generated constructor stub
		this.setName(name);
		this.setCurr(new Currency(curr));
		this.setAmount(amount);
		
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setCurr(Currency curr) {
		this.curr = curr;
	}

	public Currency getCurr() {
		return curr;
	}

	public void setAmount(Integer amount) {
		this.amount = amount;
	}

	public Integer getAmount() {
		return amount;
	}

}
```


```
package test;

public class Currency {

	private String name;
	
	public Currency(String curr) {
		// TODO Auto-generated constructor stub
		this.setName(curr);
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

}
```


```
package test;

import java.util.ArrayList;

public class start {

	/**
	 * @param args
	 * @throws FileNotFoundException 
	 * @throws NoSuchFieldException 
	 * @throws SecurityException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		ArrayList<Country> countries = new ArrayList<Country>();
		countries.add(new Country("USA", "USD", 100));
		countries.add(new Country("DE", "EUR", 20));
		countries.add(new Country("JAP", "JPY", 2000));
		
		for (Country c : countries) {
			//System.out.println(assetList.get(i));
			System.out.println(c.getName()+"\t "+c.getCurr().getName()+"\t "+c.getAmount());
		}
		
	}

}
```


----------

