【问题标题】:Java integer ArrayList return elements within a specific rangeJava 整数 ArrayList 返回特定范围内的元素
【发布时间】:2011-11-16 21:22:06
【问题描述】:

我有一个整数的 java ArrayList

ArrayList <Integer> ageList  = new ArrayList <Integer>();

我在这个 arrayList 中有一些整数值。我想创建一个新的 ArrayList,它包含上述 arrayList 中的所有元素,这些元素通过一个条件,比如 25 到 35 之间的值。即,如果我的 ageList 包含值

{12,234,45,33,28,56,27}

我的 newList 应该包含

{33,28,27}

我怎样才能做到这一点?

注意:我是从 Objective C 背景来到 java 的,在那里我使用 NSPredicate 轻松地做这样的事情..java中有任何类似的方法吗?

【问题讨论】:

  • 循环遍历列表不行吗?
  • 当然可以,但我已经是一个大约 100 次迭代的循环,我必须在该循环中执行上述操作..另外我要求更快的方法
  • 我认为你做了一个很大的假设; ObjectiveC 实现也会循环它,只是你不会看到循环,因为它被一个特性所掩盖。 NSPredicate 的底层实现仍然需要遍历数组来评估每个元素。
  • 我只是希望您知道,使用下面提到的工具包(特别是 lambdaj),相对于迭代而言,性能会受到影响……至少据我所知。
  • 投反对票的人请注意评论,这样我就可以理解我做错了什么..

标签: java search filter arraylist


【解决方案1】:

你可以使用 foreach 循环

List<Integer> newList = new ArrayList<Integer>();
for (Integer value : ageList) {
    if (value >= 25 && value <= 35) {
        newList.add(value);
    }
}

【讨论】:

    【解决方案2】:

    试试这个:

    ArrayList<Integer> newList = new ArrayList<Integer>(ageList);
    for (Iterator<Integer> it = newList.iterator(); it.hasNext();) {
        int n = it.next();
        if (n < 25 || n > 35)
          it.remove();
    }
    

    【讨论】:

    • 会用it.remove()删除原来的数组吗?
    • 它只会删除newList中的元素,而不是原始ageList中的元素,因为itnewList的迭代器。
    【解决方案3】:

    标准 API 中没有“过滤器”功能。 (但是在GuavaApache Commons 中有。)您必须创建一个新列表,遍历原始列表并手动将25-35 范围内的元素添加到新列表中。

    如果您不打算保留原始列表,您可以使用IteratorIterator.remove 方法删除超出范围的元素。

    如果您的列表中没有重复项,您可以使用 TreeSet 在这种情况下,您可以使用 headSet / tailSet 获取特定范围内的所有元素。

    相关问题:(实际上甚至可能重复)

    【讨论】:

    • 我希望有一个支持删除的foreach 循环变体。
    • 好吧,我看到了那个线程..并尝试了它的实现..我进入 java 有一个月了,我将 java 理解为一种非常高级的语言..所以我认为应该有一些漂亮的直截了当的方法..我也是为 Android 编写的,毕竟它是一个嵌入式设备,少一行代码(尤其是在循环中)不会有任何害处..无论如何,如果我必须循环,我已经准备好循环了。 ..感谢您的努力..
    • 好吧,我决定在 atlast 周围循环。不想为这种情况添加外部库,即使它是由强大的 Google 提供的。谢谢您的回复..我会有一个 loooooooooooooooop ......
    • 你也可以探索 Navigable Set (unique values) 和 Navigable Map (key as unqiues values, value as counts of duplicates) 然后做耳机、heapMap、tailSet、tailMap 等等
    【解决方案4】:

    标准 JCF 无法实现。你必须迭代。

    考虑使用番石榴。它有这样的实用程序。

    http://code.google.com/p/guava-libraries/

    【讨论】:

      【解决方案5】:

      不,java [AFAIK] 中没有内置功能。

      步骤可以是:

      1. 遍历ageList。
      2. 检查条件。
      3. 如果条件成功,则将该元素添加到新列表中,否则什么也不做。

      示例代码:

          List<Integer> ageList = new ArrayList<Integer>();
          //-- add data in ageList
      
          List<Integer> newList = new ArrayList<Integer>();
          for (Integer integer : ageList) {
              if(integer >= 25 && integer <= 35)
                  newList.add(integer);
          }
      

      【讨论】:

        【解决方案6】:

        好吧,Guava 你可以这样写:

        Iterable<Integer> filtered = Iterables.filter(list, new Predicate<Integer>() {
            @Override public boolean apply(Integer value) {
                return value >= 25 && value <= 35;
            }
        });
        List<Integer> newList = Lists.newArrayList(filtered);
        

        【讨论】:

        • +1,很好。我通常写25 &lt;= value &amp;&amp; value &lt;= 35这样的范围来模仿数学符号25 &lt;= value &lt;= 35
        • @aioobe:我很欣赏这种方法,但同样我发现左侧常量的条件更难理解。在某处有一个范围类型的参数:)
        • +1,如果您可以相信 Guava 不会在每次迭代时打电话回家。 XD
        • 谢谢你,我以前从未听说过 Guava,但我只是从 java 开始。对于目前的问题,我决定坚持使用迭代器和循环。我相信我会回来未来某个时候到番石榴..
        【解决方案7】:

        迭代它并添加匹配的那些?这是 3 行代码... 4 包括新的 ArrayList 声明。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-16
          • 1970-01-01
          • 2020-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多