2016-03-23 3 views
2

Ich habe eine Liste von Person Objekte:Prüfen, ob ein Feld in einer Liste von Objekten einen bestimmten Wert hat?

List<Person> allPersons = new ArrayList<Person>(); 

Die Person-Objekt hat eine fieldAddress genannt.

Ich möchte überprüfen, dass mindestens eine Person in der Liste hat eine bestimmte Adresse Wie kann ich das tun?

Ich weiß, dass es eine .containsValue() Methode gibt, wenn Sie eine HashMap verwenden, aber gibt es etwas Ähnliches für eine ArrayList?

Edit: Bitte beachten Sie, dass ich für einen bestimmten Feldwert innerhalb jedes Objekt, bin auf der Suche nicht das Objekt selbst?

+0

'contains()' https://docs.oracle.com/javase/7/docs/api/java/util/List.html#contains(java.lang.Object) – Ramanlfc

+0

Ja, eine Schleife mit if enthält Arbeit. –

+0

@ sᴜʀᴇsʜᴀᴛᴛᴀ kannst du bitte ein Beispiel geben – java123999

Antwort

6

Sie müssen auf die eine oder andere Weise über die Liste iterieren.

Ein bequemer Weg, es zu tun mit Java8 Streams:

boolean found = allPersons.stream().anyMatch(p->p.getAddress().equals(someAddress)); 
+0

Danke, was ist das Äquivalent zu dieser Version von Java? – java123999

+1

@ java123999 In einer älteren Version müssen Sie mit einer Schleife über die Liste iterieren (zum Beispiel 'boolean found = false; für (Person p: allPersons()) {if (p.getAddress(). equals (someAddress)) {found = true; break;}} ' – Eran

+1

@ java123999 Schauen Sie hier: http://stackoverflow.com/questions/7481346/finding-out-if-a-list-of -objects-contains-something-with-a-specified-field-value –

2

Wenn Sie auf diese Überprüfung oft planen, legen Sie die Adressen in der Set<String>, auf dem Sie dann die contains Methode aufrufen können:

Set<String> allAddresses = 
    allPersons.stream().map(Person::getAddress).collect(toSet()); 
// ... 
boolean found = allAddresses.contains(someAddress); 
-2

Als Ergänzung, wenn Sie sich nicht wohl fühlen sich mit Eran Antwort (die die bestmögliche Antwort ist) oder Sie können nicht verwenden Java 8, erstellen Sie einfach eine Methode, wie:

public boolean checkAdress(String adress) 
{ 
    boolean found = false; 
    for(int i = 0; i < allPersons.size() && !found; i++) 
     found = allPersons.get(i).getAdress().equals(adress); 
    return found; 
} 

Dies ist, was ich vor Java 8.

+0

Warum wurde das abgelehnt? –

+0

Die Schleife wird beendet, wenn sie wahr ist. Sehen Sie sich den Zustand im Inneren an. Und nein, ich muss nicht die Iterationsnotation verwenden. Es ist nicht effizienter. –

+0

Mein schlechtes! Habe nicht bemerkt, dass deine Schleife zur richtigen Zeit beendet wird! Das heißt, selbst wenn es im Falle einer 'ArrayList' nicht effizienter ist, ist die for-each-Schleife viel besser lesbar. –

-1

Sie könnten einfach tun, um zu tun, verwendet, während + Iterator Schleife

boolean found = false; 
Iterator it = allPersons.iterator(); 
Person currentPerson = null; 

while(!found && it.hasNext()){ 
    currentPerson = it.next(); 
    if(currentPerson != null && paramAdress.equals(person.getAddress()){ 
     found = true; 
    } 
} 
3

Sie asLazy() und collect() von Eclipse Collections verwenden können:

Wenn Sie kann verwenden, um die MutableList Schnittstelle:

MutableList<Person> allPersons = Lists.mutable.empty(); 
boolean found = 
    allPersons.asLazy().collect(Person::getAddress).contains(someAddress); 

Wenn Sie nicht die Art von allPersons von List ändern können:

List<Person> allPersons = new ArrayList<>(); 
boolean found = 
    LazyIterate.collect(allPersons, Person::getAddress).contains(someAddress); 

Hinweis: Ich bin ein Beitrag Kollektionen Eclipse.

Verwandte Themen