web-dev-qa-db-ja.com

オブジェクトのフィールドを使用してArrayListをフィルタリングする

オブジェクトで満たされたArrayListがあります。

2つのフィールドを持つArticleというオブジェクトクラス。

public class Article {

    private int codeArt;
    private String desArt;

  public Article(int aInt, String string) {
        this.desArt = string;
        this.codeArt = aInt;
    }

    public int getCodeArt() {return codeArt; }
    public void setCodeArt(int codeArt) {this.codeArt = codeArt;}
    public String getDesArt() {return desArt;}
    public void setDesArt(String desArt) { this.desArt = desArt;}

}

desArtフィールドを使用してリストをフィルタリングし、テストには文字列「test」を使用します。

GoogleのGuavaを使用して、ArrayListをフィルタリングできます。

これは私が試したコードです:

private List<gestionstock.Article> listArticles = new ArrayList<>();

//Here the I've filled my ArrayList

private List<gestionstock.Article> filteredList filteredList = Lists.newArrayList(Collections2.filter(listArticles, Predicates.containsPattern("test")));

しかし、このコードは機能していません。

13
Aimad Majdou

これは正常です: Predicates.containsPattern()CharSequencesで動作しますが、これはgestionStock.Articleオブジェクトでは実装されていません。

独自の述語を記述する必要があります。

public final class ArticleFilter
    implements Predicate<gestionstock.Article>
{
    private final Pattern pattern;

    public ArticleFilter(final String regex)
    {
        pattern = Pattern.compile(regex);
    }

    @Override
    public boolean apply(final gestionstock.Article input)
    {
        return pattern.matcher(input.getDesArt()).find();
    }
}

次に使用します:

 private List<gestionstock.Article> filteredList
     = Lists.newArrayList(Collections2.filter(listArticles,     
         new ArticleFilter("test")));

ただし、これは@mgnypで示されているように、非関数型プログラミングを使用してはるかに少ないコードで実行できる何かのかなりのコードです...

17
fge

In Java 8、フィルターを使用

List<Article> articleList = new ArrayList<Article>();
List<Article> filteredArticleList= articleList.stream().filter(article -> article.getDesArt().contains("test")).collect(Collectors.toList());
24
Free-Minded

Forループまたはforループを使用して、リストをループできます。何らかの条件に基づいて別のリストを作成しますか?これでうまくいくと思う。

List<Article> secondList = new ArrayList<Article>();

for( Article a : listArticles) { 
// or equalsIgnoreCase or whatever your conditon is
if (a.getDesArt().equals("some String")) {
// do something 
secondList.add(a);
}
}
11
monika

Guavaは、Javaで関数型プログラミングを使用できるライブラリです。関数型プログラミングでの成功の1つは、次のようなコレクション変換です。

コレクション-> op-> op-> op-> transformedCollection。

ここを見て:

Collection<Article> filtered = from(listArticles).filter(myPredicate1).filter(myPredicate2).filter(myPredicate3).toImmutableList();

きれいですね。

2つ目の利点は、ラムダ関数です。ここを見て:

Collection<Article> filtered = from(listArticles)
  .filter((Predicate) (candidate) -> { return candidate.getCodeArt() > SOME_VALUE })
  .toImmutableList();

実際、Javaにはまだ純粋なラムダ関数がありません。 Java 8でそれを行うことができます。しかし、今のところIDE Inellij Ideaでこれを書くことができ、IDEはそのようなラムダをオンザフライで作成されるPredicateに変換します:

Collection<Article> filtered = from(listArticles)
        .filter(new Predicate<Article>() {
            @Override
            public boolean apply(Article candidate) {
                return candidate.getCodeArt() > SOME_VALUE;
            }
        })
        .toImmutableList();

フィルター条件に正規表現が必要な場合、コードはより複雑になり、条件を別のメソッドに移動するか、Predicate全体を別のクラスに移動する必要があります。

このすべての関数型プログラミングが複雑すぎると思われる場合は、新しいコレクションを作成し、手動で(グアバを使用せずに)入力してください。

List<Article> filtered = new ArrayList<Article>();
for(Article article : listArticles)
{
    if(article.getCodeArt() > SOME_VALUE)
        filtered.add(article);
}
2
n00bot

グアバでは、次のようなCollections2.filterを使用するのがはるかに簡単だと思います。

Collections2.filter(YOUR_COLLECTION, new Predicate<YOUR_OBJECT>() {
  @Override
  public boolean apply(YOUR_OBJECT candidate) {
    return SOME_ATTRIBUTE.equals(candidate.getAttribute());
  }
});
2
facundofarias

これを試して:

private List<gestionstock.Article> listArticles = new ArrayList<>();
private List<gestionstock.Article> filteredList filteredList = Lists.newArrayList(Collections2.filter(listArticles, new Predicate<gestionstock.Article>(){
        public boolean apply(gestationstock.Article article){
            return article.getDesArt().contains("test")
        }
    }));

カスタムオブジェクトを使用しているため、独自の述語を実装する必要があります。他の場所で使用している場合は、ファイルで定義してください。そうでなければ、この実装はうまく機能します。

1
user1732480