关于java:ArrayList过滤器

ArrayList filter

本问题已经有最佳答案,请猛点这里访问。

如何从Java ARAYLIST中筛选出一些东西,如:

  • 你好吗?
  • 你怎么做
  • 迈克
  • 过滤器是"怎样"的,它可以去除乔和迈克。


    在Java-8中,他们引入了以Predicate为参数的方法removeIf

    所以很容易做到:

    1
    2
    3
    4
    5
    List<String> list = new ArrayList<>(Arrays.asList("How are you",
                                                     "How you doing",
                                                     "Joe",
                                                     "Mike"));
    list.removeIf(s -> !s.contains("How"));


    也许最好的方法是用番石榴

    1
    2
    3
    4
    5
    6
    7
    8
    9
    List<String> list = new ArrayList<String>();
    list.add("How are you");
    list.add("How you doing");
    list.add("Joe");
    list.add("Mike");

    Collection<String> filtered = Collections2.filter(list,
        Predicates.containsPattern("How"));
    print(filtered);

    印刷品

    1
    2
    How are you
    How you doing

    如果要将筛选后的集合作为列表,可以使用此项(也可以从guava获取):

    1
    2
    List<String> filteredList = Lists.newArrayList(Collections2.filter(
        list, Predicates.containsPattern("How")));


    遍历列表并检查是否包含字符串"how",如果包含字符串,则将其删除。您可以使用以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // need to construct a new ArrayList otherwise remove operation will not be supported
    List<String> list = new ArrayList<String>(Arrays.asList(new String[]
                                      {"How are you?","How you doing?","Joe","Mike"}));
    System.out.println("List Before:" + list);
    for (Iterator<String> it=list.iterator(); it.hasNext();) {
        if (!it.next().contains("How"))
            it.remove(); // NOTE: Iterator's remove method, not ArrayList's, is used.
    }
    System.out.println("List After:" + list);

    输出:

    1
    2
    List Before: [How are you?, How you doing?, Joe, Mike]
    List After: [How are you?, How you doing?]


    给自己写一个过滤函数

    1
    2
    3
     public List<T> filter(Predicate<T> criteria, List<T> list) {
            return list.stream().filter(criteria).collect(Collectors.<T>toList());
     }

    然后使用

    1
        list = new Test().filter(x -> x > 2, list);

    这是Java中最简洁的版本,但是需要JDK 1.8来支持lambda演算。


    我同意先前的答案,谷歌的番石榴可能在这里帮助很大,可读性方面:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    final Iterables.removeIf(list, new Predicate<String>() {
        @Override
        public boolean apply(String input) {
            if(input.contains("How")) { //or more complex pattern matching
                return true;
            }
            return false;
        }
    });

    请注意,这基本上是一个guava的副本——如何根据谓词从列表中删除,以跟踪删除的内容?


    由于您没有给我们太多信息,我假设您编写代码的语言是C。首先:首选System.Collections.Generic.List而不是ArrayList。第二:一种方法是循环遍历列表中的每一项,并检查它是否包含"how"。另一种方法是使用LINQ。下面是一个快速的例子,它过滤掉了所有不包含"如何"的项目:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var list = new List<string>();
    list.AddRange(new string[] {
       "How are you?",
       "How you doing?",
       "Joe",
       "Mike", });

    foreach (string str in list.Where(s => s.Contains("How")))
    {
        Console.WriteLine(str);
    }
    Console.ReadLine();