【问题标题】:Java filter works with one predicate but not with anotherJava 过滤器适用于一个谓词,但不适用于另一个谓词
【发布时间】:2021-02-04 12:19:30
【问题描述】:

帮助!这一点意义都没有。 我有一个 Java 集合和一个过滤这个集合的方法。

public void filter(Predicate<? super T> predicate) {
    for (MyItem<T> item=head; item!=null; item=item.next) {
        if(predicate.test(item.key))
            remove(item.key);
        item = item.next;
    }
}

然后,当我使用一个谓词运行它时,它就起作用了。

public static void main(String[] args) {
    MySet<Integer> set = new MySet<>();
    for(int i=0; i<20; i++) {
        set.add(i);
    }
    set.filter(x->x%2==0);
    MyItem<Integer> item = set.head;
    for(int i=0; i<10; i++) {
        System.out.println(item.key);
        item = item.next;
    }
}

它正确输出了从 1 到 19 的所有奇数。 但是,如果我将谓词更改为 x-&gt;x%2==1,它不会输出 0 到 18 的所有偶数,而是输出 0 到 9 的 所有 数字。

为什么这甚至可能???

提前致谢!

【问题讨论】:

    标签: java filter predicate


    【解决方案1】:

    你有 2 次 item=item.next,一次在 for 循环声明中,一次在里面。所以你跳过了一半的项目。

    for (MyItem<T> item=head; item!=null; item=item.next) {
        if(predicate.test(item.key))
            remove(item.key);
        // item = item.next; ???
    }
    

    【讨论】:

      【解决方案2】:

      问题很可能是因为您在 filter 方法内跳过了循环中的每个第二个元素。您在那里调用item = item.next 两次,作为循环的“增量”(循环定义的第三部分),然后在每次迭代结束时。

      public void filter(Predicate<? super T> predicate) {
          for (MyItem<T> item=head; item!=null; item=item.next) { //<- here
              if(predicate.test(item.key))
                  remove(item.key);
              item = item.next; //<- here
          }
      }
      

      删除其中任何一个,最好是在最后一行,它应该可以正常工作。

      【讨论】:

      • 非常感谢,我现在意识到我的问题是多么愚蠢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多