12

アイテムのリストがあり、ブール値のプロパティ (フィールド変数) を持つアイテムのリストを見つけたいと考えていますx=true

これは反復によって達成できることは知っていますが、Apache Commons のようなコモンズ ライブラリでそれを行うための一般的な方法を探していました。

4

5 に答える 5

21

Predicate を実装する apache commons collection を使用できます。

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html

サンプル:

package snippet;

import java.util.Arrays;
import java.util.Collection;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;

public class TestCollection {

    public static class User {

        private String name;

        public User(String name) {
            super();
            this.name = name;
        }

        public String getName() {
            return name;
        }

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

        @Override
        public String toString() {
            return "User [name=" + name + "]";
        }

    }

    public static void main(String[] args) {
        Collection<User> users = Arrays.asList(new User("User Name 1"), new User("User Name 2"), new User("Another User"));
        Predicate predicate = new Predicate() {

            public boolean evaluate(Object object) {
                return ((User) object).getName().startsWith("User");
            }
        };
        Collection filtered = CollectionUtils.select(users, predicate);
        System.out.println(filtered);
    }
}

いくつかのサンプルがここにあります: http://apachecommonstipsandtricks.blogspot.de/2009/01/examples-of-functors-transformers.html

特定のフィールドやプロパティの値を検査するなど、より一般的なものが必要な場合は、次のようにすることができます。

public static class MyPredicate implements Predicate {

    private Object expected;
    private String propertyName;

    public MyPredicate(String propertyName, Object expected) {
        super();
        this.propertyName = propertyName;
        this.expected = expected;
    }

    public boolean evaluate(Object object) {
        try {
            return expected.equals(PropertyUtils.getProperty(object, propertyName));
        } catch (Exception e) {
            return false;
        }
    }

}

これにより、特定のプロパティを期待値と比較できます。使用方法は次のようになります。

Collection filtered = CollectionUtils.select(users, new MyPredicate("name", "User Name 2"));
于 2012-06-11T12:57:11.540 に答える
11

問題は、Javaでの反復がはるかに単純でクリーンな場合が多いことです。おそらく、Java8のクロージャーがこれを修正するでしょう。;)

@Spaethのソリューションと比較してください。

List<String> mixedup = Arrays.asList("A", "0", "B", "C", "1", "D", "F", "3");
List<String> numbersOnlyList = new ArrayList<>();
for (String s : mixedup) {
    try {
        // here you could evaluate you property or field
        Integer.valueOf(s);
        numbersOnlyList.add(s);
    } catch (NumberFormatException ignored) {
    }
}
System.out.println("Results of the iterated List: " + numbersOnlyList);

あなたが見ることができるようにそれははるかに短くそしてより簡潔です。

于 2012-06-11T13:10:22.017 に答える
4

これを行うには、 Google guavafilterメソッドを使用できます。コモンズにもfilterメソッドがあります

于 2012-06-11T12:58:33.557 に答える
1

これを実現するために、Java では、hashCode および equals メソッドをオーバーライドできます。

例えば

@Override
public int hashCode() {
    return eventId;
}

@Override
public boolean equals(Object obj) {
    if(obj instanceof CompanyTimelineView) {
        CompanyTimelineView new_name = (CompanyTimelineView) obj;
        if(new_name.eventId.intValue() == this.eventId.intValue()){
            return true;
        }
    }
    return false;
}

この例では、eventId 整数値を一致させました。ここでクラスとそのプロパティを使用できます。この後、リストの contains,indexOf,lastIndexOf および get メソッドを使用して、リスト内の要素を見つけることができます。下記参照。

//tempObj is nothing but an empty object containing the essential properties
//tempObj should posses all the properties that are being compared in equals method.

if(listOfObj.contains(tempObj)){
    return listOfObj.get(listOfObj.indexOf(tempObj));
}
于 2012-06-11T12:58:04.987 に答える