0

リストに特定のキー値を持つオブジェクトが含まれているかどうかをテストできるようにしたい

たとえば、 Iterables.contains(l2, "lname", "Jordan")); のようなことをしたいと思います。 l2 で以下のように他のすべての Map オブジェクトを作成する代わりに

//List<String> l = Arrays.asList("Mickael", "Jordan", "His Airness");
//System.out.println(Iterables.contains(l, "Jordan"));

Map<String, String> p1 = new HashMap<String, String>();
p1.put("fname", "Mickael");
p1.put("lname", "Jordan");
p1.put("nname", "His Airness");

Map<String, String> p2 = new HashMap<String, String>();
p2.put("fname", "Paul");
p2.put("lname", "Pierce");
p2.put("nname", "The Truth");
List<Map<String, String>> l2 = Arrays.asList(p1, p2);
Map<String, String> p3 = new HashMap<String, String>();
p3.put("fname", "Mickael"); //
p3.put("lname", "Jordan");
p3.put("nname", "His Airness"); //
System.out.println(Iterables.contains(l2, p3));

そのようなグアバの機能があるかどうかを知りたいのですが、l2でループを実行せず、各 elt.get("lname") をテストします

編集

3 つの解決策の回答: どれがよりパフォーマンスが高いかを確認する

System.out.println(Iterables.any(l2, withEntry("lname", "Jordan"))); //@axtavt
System.out.println(has("lname", "Jordan")); //@JB
System.out.println(Iterables.any(l2, new KeyValuePredicate("lname", "Jordan"))); //@JB

public static Boolean has(final String key, final String value) {
    return Iterables.any(l2, new Predicate<Map<String, String>>() {
        @Override
        public boolean apply(Map<String, String> input) {
            return input.get(key).equals(value);
        }
    });
}

public static Predicate<Map<String, String>> withEntry(final String key, final String value) {
    return new Predicate<Map<String, String>>() {
        public boolean apply(Map<String, String> input) {
            return value.equals(input.get(key));
        }
    };
}

class KeyValuePredicate implements Predicate<Map<String, String>>{
private String key;
private String value;
public KeyValuePredicate(String key, String value) {
    super();
    this.key = key;
    this.value = value;
}
@Override
public boolean apply(Map<String, String> arg0) {
    // TODO Auto-generated method stub
    return arg0.get(key).equals(value);
}

}
4

3 に答える 3

1
return Iterables.any(l2, new Predicate<Map<String, String>>() {
    @Override
    public boolean apply(Map<String, String> input) {
        return input.get("lname").equals("Jordan");
    }
});

ただし、プロパティを持つオブジェクトを使用する必要がある場合は、マップを使用しています。

もちろん、さまざまなプロパティを使用してこれを複数回行う必要がある場合は、述語を匿名ではない再利用可能なクラスに変換する必要があります。

return Iterables.any(l2, new KeyValuePredicate("lname", "Jordan"));
于 2012-06-06T16:47:51.383 に答える
0

あなたは適切なものを実装しPredicateて使用することができますIterables.any()

public Predicate<Map<String, String>> withEntry(final String key, final String value) {
    return new Predicate<Map<String, String>>() {
        public boolean apply(Map<String, String> input) {
            return value.equals(input.get(key));
        }
    };
}

System.out.println(Iterables.any(l2, withEntry("lname", "Jordan")));
于 2012-06-06T16:47:34.223 に答える
0

これは簡単です。

適切なエンティティクラスを作成する必要があります。

public class Person {

    private String fName;
    private String lName;
    private String nName;

    public Person(String fName, String lName, String nName) {
        this.fName = fName;
        this.lName = lName;
        this.nName = nName;
    }

    public String getFName() {
        return fName;
    }

    public String getLName() {
        return lName;
    }

    public String getNName() {
        return nName;
    }

}

次に、次のことを実行できます。

import java.util.*;
public class Test {

    public static void main (String [] args) {

        List<Person> list = new ArrayList<Person>();
        Person p1 = new Person("Mickael", "Jordan", "His Airness");

        for (Person person : list) {
            if (person.getFName().equals("Mickael")) {
                System.out.println("Mickael is in the list!");
                break;
            }
        }
    }
}
于 2012-06-06T16:50:34.200 に答える