2016-06-17 5 views
2

Ich möchte Objekte in einer Liste basierend auf einer bestimmten Eigenschaft finden.Wie kann ich Werte aus einer Liste von Objekten basierend auf einer Eigenschaft dieser Objekte extrahieren?

Zum Beispiel sagen, dass ich eine Liste von Objekten dieser Klasse haben:

class Person { 
    private String name; 
    private String id; 
} 

Ich weiß, dass ich durch die Verwendung alle der Namen von Personen in der Liste bekommen:

Collection<String> names = CollectionUtils.collect(
    personList, 
    TransformerUtils.invokerTransformer("getName")); 

aber was ich tun möchte, ist eine Liste der Person Objekte, deren Name ist zum Beispiel "Nick". Ich habe Java nicht 8.

+0

Was ist falsch daran, einfach die Liste zu durchlaufen und jeden Namen zu überprüfen? – Gendarme

+0

iterieren Sie die Liste mit einer for-Anweisung, prüfen Sie, ob der Name gleich 'Nick' ist und wenn ja, fügen Sie das Objekt zu einer anderen Liste – DAVIDBALAS1

+0

für Schleifen hinzu und wenn Anweisungen immer da sind. –

Antwort

6

Ich sehe, Sie Apache Commons Utils verwenden verwenden, dann können Sie:

CollectionUtils.filter(personList, new Predicate<Person>() { 
    @Override 
    public boolean evaluate(Person p) { 
     return p.getName() != null && p.getName().equals("Nick"); 
    } 
}); 
+3

'return" Nick ".equals (p.getName());' – shmosel

+0

Apache Sammlung utils bietet die Methode, einen Trasformer in ein Prädikat zu verwandeln Daher ist die anonyme Klasse nicht erforderlich (vorausgesetzt, das OP ist bereit, reflect zu verwenden, wie in seinem Codebeispiel angegeben). – BeeOnRope

+0

@svasa Vielen Dank. –

3

Wenn Sie Java 8-Streams nicht verwenden möchten, einfach Schleife durch die Liste und überprüfen Sie die Elemente manuell:

ArrayList<Person> filteredList = new ArrayList<Person>(); 

for(Person person : personList) { 
    if(person.getName().equals("Nick")) filteredList.add(person); 
} 
3

Apache Sammlung utils verwenden (die Sie bereits verwenden), können Sie die filter Methode verwenden, die eine Teilmenge der Sammlung von Gegenständen aus erstellt, die einen gegebenen Filter entsprechen, mit einem kombinierten Predicate das entspricht "Nick" basierend auf yo ur Transformer und transformedPredicate:

CollectionUtils.filter(names, PredicateUtils.transformedPredicate(
    TransformerUtils.invokerTransformer("getName"), PredicateUtils.equalPredicate("Nick"))); 

Das heißt, Sie einen stark funktionalen Ansatz solche Verwendung zu überdenken, bevor Sie 8. nur Sie haben, nachdem Sie eine Menge redundanten Apache Sammlungen Code wird nicht auf Java migrieren migrieren, die Lösungen vor der Einführung von Verschlüssen und Lambdas neigen dazu, ausführlich und oft weniger leserlich zu sein als die imperativen Alternativen.

Hinweis: Dies ändert die bestehende Sammlung in-Place. Wenn dies nicht das gewünschte Verhalten ist, müssen Sie eine Kopie erstellen, bevor Sie die Filtermethode aufrufen.

+0

Ihr Code scheint alle Ergebnisse zu entfernen, nicht nur die, die ich extrahieren möchte –

+0

Es sollte funktionieren, obwohl es möglicherweise einen Fehler gibt (ich habe es nicht versucht). Können Sie eine SSCCE, die zeigt, dass es nicht funktioniert? – BeeOnRope

+0

Sicher Ding. Ich werde po st es in einer Weile. –

0

Sie könnten versuchen, eine HashMap zu verwenden.

HashMap<String, Integer> points = new HashMap<String, Integer>(); 
    points.put("Amy", 154); 
    points.put("Dave", 42); 
    points.put("Rob", 733); 
    System.out.println(points.get("Dave")); 

Dies wäre nur ein Beispiel, aber Sie könnten überprüfen und stattdessen den String zu haben, Integer, könnten Sie versuchen, Integer, String und ein if statement haben. Nur eine Idee.

0

Ich überlege, dass Sie möglicherweise eine Sammlung von verschiedenen Objekten haben, die diesen Eigenschaftsnamen haben. Denn das würde ich Ihnen empfehlen Eltern zu tun, für diese Komponenten und führen Sie die Suche auf es mit Generika:

Zum Beispiel:

Geordnete Klasse Name.java

public class Name { 

    private String name; 

    public Name(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

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

Klasse Pet.java

public class Pet extends Name{ 

    public Pet(String name) { 
     super(name); 
    } 

} 

Und Klasse Person.

java
public class Person extends Name{ 

    public Person(String name) { 
     super(name); 
    } 

} 

Job-Klasse, die nicht die Eigenschaft hat:

public class Job { 

    private String description; 

    public Job(String description) { 
     this.description = description; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

} 

dass, so können Sie die Instanz davon überprüfen und vergleichen, was Sie wollen:

public static void main(String ... args) { 
    List<Object> objectList = new ArrayList(); 
    objectList.add(new Person("Nick")); 
    objectList.add(new Person("Nik")); 
    objectList.add(new Person("Nikc")); 
    objectList.add(new Person("Ncik")); 
    objectList.add(new Pet("Nick")); 
    objectList.add(new Pet("Nik")); 
    objectList.add(new Pet("Nikc")); 
    objectList.add(new Pet("Ncik")); 
    objectList.add(new Job("Nick")); 
    objectList.add(new Job("Nik")); 
    objectList.add(new Job("Nikc")); 
    objectList.add(new Job("Ncik")); 

    for (Object o : extractObjectsMatching("Nick", objectList)){ 
     System.out.println(((Name) o).getName()); 
    } 
} 

public static List<Object> extractObjectsMatching(String name, List<Object> objectList){ 
    List<Object> matches = new ArrayList<>(); 
    for (Object e : objectList){ 
     if (e instanceof Name && ((Name) e).getName().contains(name)){ 
      matches.add(e); 
     } 
    } 

    return matches; 
} 

Wenn die Objektklasse ist keine Instanz von Name, bedeutet, dass die gesuchte Eigenschaft nicht vorhanden ist, ignorieren Sie sie einfach, vergleichen Sie sie mit den gewünschten Informationen und speichern Sie sie abzurufen.