фільтрацыі ў ArrayList, выкарыстоўваючы поле аб'екта

У мяне ёсць ArrayList, які запаўняецца аб'ектамі.

Мой клас аб'ектаў называецца Артыкул , які мае два поля;

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 , а для тэсту я выкарыстаў радок «тэст».

Я выкарыстаў Guava ад Google, які дазваляе мне адфільтраваць ArrayList.

гэта код, які я спрабаваў:

private List listArticles = new ArrayList<>();

//Here the I've filled my ArrayList

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

але гэты код не працуе.

9
Як гэта не працуе? Я б паставіў на памылкі кампіляцыі ...
дададзена аўтар fge, крыніца
@fge, таму што я фільтрацыі, выкарыстоўваючы радок, я т фільтраванне, выкарыстоўваючы поле аб'екта, але я не ведаю, як гэта зрабіць.
дададзена аўтар Aimad Majdou, крыніца
Вы павінны рэалізаваць свой уласны прэдыкаты , ні адзін з тых, якое прадстаўляецца прэдыкаты (за выключэннем NotNull() / IsNull() ) будзе мець магчымасць фільтраваць ваш аб'ект у значнай ступені. Чыталі вы Functional патлумачыў ?
дададзена аўтар Frank Pavageau, крыніца
Я не так добра знаёмы, як я павінен быць з бібліятэкай гуава, але я думаю, што вам трэба выкарыстоўваць Predicate.compose (прэдыкатаў прэдыкатаў, функцыя <�А,? Пашырае B> функцыю), каб стварыць новую функцыю для праверкі таго, канкрэтнае поле з'яўляецца правільным. Я адпраўлю адказ на працягу некалькіх хвілін з нейкім дакладным рашэннем. Але ад таго, што я разумею, гэта тое, што вы павінны зрабіць.
дададзена аўтар cxdf, крыніца

6 адказы

У Java 8, выкарыстоўваючы фільтр

List
articleList = new ArrayList
(); List
filteredArticleList= articleList.stream().filter(article -> article.getDesArt().contains("test")).collect(Collectors.toList());
17
дададзена
без выкарыстання выразы LAMDA будзе ўдзячны :)
дададзена аўтар LOG_TAG, крыніца

Гэта нармальна: Predicates.containsPattern() дзейнічае на CharSequence з, што ваш gestionStock.Article аб'ект не рэалізуе.

Вы павінны напісаць свой уласны прэдыкатаў:

public final class ArticleFilter
    implements Predicate
{
    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 filteredList
     = Lists.newArrayList(Collections2.filter(listArticles,     
         new ArticleFilter("test")));

Тым не менш, гэта цалкам пэўны код для тое, што можа быць зроблена нашмат менш кода з ужываннем ня функцыянальнага праграмавання, як паказана на @mgnyp ...

16
дададзена
@LahiruPrasanna гэта гуавы ў Спісы , бо гаворка ідзе пра гуава
дададзена аўтар fge, крыніца
што спісы тут?
дададзена аўтар Lahiru Prasanna, крыніца
дзякуй у мяне яго і пабудаваць з Gradle
дададзена аўтар Lahiru Prasanna, крыніца

Вы можаце выкарыстоўваць для цыкла або для кожнага цыклу ў цыкле праз спіс. Вы хочаце стварыць яшчэ адзін спіс, заснаваны на нейкім стане? Гэта павінна працаваць, я думаю.

List
secondList = new ArrayList
(); for( Article a : listArticles) { // or equalsIgnoreCase or whatever your conditon is if (a.getDesArt().equals("some String")) { // do something secondList.add(a); } }
11
дададзена

З гуава, я б сказаў, што самы просты спосаб, безумоўна, будзе з дапамогай Collections2.filter, такіх як:

Collections2.filter(YOUR_COLLECTION, new Predicate() {
  @Override
  public boolean apply(YOUR_OBJECT candidate) {
    return SOME_ATTRIBUTE.equals(candidate.getAttribute());
  }
});
2
дададзена

Гуава гэта бібліятэка, якая дазваляе выкарыстоўваць некаторыя функцыянальнае праграмаванне ў Java. Адна з выйгрышных рэчаў у функцыянальным праграмаванні з'яўляецца збор пераўтварэнні, як

Collection -> op -> op -> op -> transformedCollection.

Паглядзіце тут:

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

Гэта прыгожа, ці не так?

The second one winning thing is lambda functions. Паглядзіце тут:

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

На самай справе, Java не мае чыста лямбда-функцыі яшчэ. Мы зможам зрабіць гэта ў Java 8. Але цяпер мы можам напісаць у IDE Inellij ідэі і IDE ператварае такую ​​лямбда ў прэдыкатаў, створаную на лета:

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

Калі ўмова фільтра патрабуецца рэгулярны выраз, код становіцца больш складаным, і вам трэба будзе перамясціць ўмова асобнага метаду або перамясціць ўвесь прэдыкатаў ў асобны клас.

Калі ўсё гэта функцыянальнае праграмаванне здаецца занадта складаным, проста стварыць новую калекцыю і запоўніць яго ўручную (без гуавы):

List
filtered = new ArrayList
(); for(Article article : listArticles) { if(article.getCodeArt() > SOME_VALUE) filtered.add(article); }
2
дададзена
Гэта не складана, гэта проста obfucated.
дададзена аўтар Glenn Maynard, крыніца

Паспрабуйце гэта:

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

Ідэя істота, так як вы карыстаецеся карыстацкі аб'ект, вы павінны рэалізаваць свой уласны прэдыкатаў. Калі вы выкарыстоўваеце яго ў іншым месцы, вызначыць яго ў файл, у адваротным выпадку, гэтая рэалізацыя працуе добра.

1
дададзена