Java整数ArrayList返回特定范围内的元素

3
我有一个Java整数ArrayList。
ArrayList <Integer> ageList  = new ArrayList <Integer>();

我有一个整数数组列表。我想创建一个新的ArrayList,其中包含通过条件的所有元素,例如25到35之间的值。如果我的ageList包含以下值:
{12,234,45,33,28,56,27}
那么我的newList应该包含
{33,28,27}
我该如何实现这个?
注意:我从使用NSPredicate轻松完成这种事情的Objective C背景转到了Java。是否有类似的java方法?

仅仅在循环中遍历列表就可以了吗? - ZenMaster
当然可以这样做,但是我已经循环了大约100次,并且我必须在该循环内执行上述操作。此外,我正在寻求更快的方法。 - Krishnabhadra
3
我认为你进行了一个很大的假设;ObjectiveC的实现也会遍历它,只不过由于特性的屏蔽,你看不到这个循环。NSPredicate的底层实现仍然需要遍历数组以评估每个元素。 - Charles Goodwin
我只是希望你知道,在使用下面提到的工具包(特别是lambdaj)时,与仅迭代相比会有性能损失...至少根据我的了解。 - ZenMaster
请给我点踩的人,请留下评论,这样我就能理解我做错了什么。 - Krishnabhadra
7个回答

7
标准API中没有“过滤器”功能。(然而在GuavaApache Commons中有。)你需要创建一个新列表,循环遍历原始列表,并手动将25-35范围内的元素添加到新列表中。
如果您不打算保留原始列表,可以使用IteratorIterator.remove方法将范围外的元素删除。
如果列表中没有重复项,则可以使用TreeSet,在这种情况下,您可以使用headSet/tailSet获取指定范围内的所有元素。
相关问题:(可能实际上是重复的)
- Java集合过滤的最佳方法是什么?

жҲ‘еёҢжңӣжңүдёҖз§Қж”ҜжҢҒеҲ йҷӨж“ҚдҪңзҡ„foreachеҫӘзҺҜеҸҳдҪ“гҖӮ - Thilo
我看到了那个线程,并尝试了它的实现。我学习Java已经一个月了,我认为Java是一种相当高级的语言。所以我想应该有某种相当直接的方法。另外,我正在编写Android应用程序,这毕竟是一个嵌入式设备,少写一行代码(特别是在循环中)不会有任何问题。无论如何,如果必须循环,我已经准备好了。感谢你的努力。 - Krishnabhadra
1
好的,我决定最终使用循环..即使是由强大的Google提供的,也不想为这种情况添加外部库..谢谢回复..我要开始循环了。。。 - Krishnabhadra
你可以进一步探索Navigable Set(唯一值)和Navigable Map(键为唯一值,值为重复次数),然后进行headset、heapMap、tailSet、tailMap等操作。 - Scorpion

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
+1,不错。我通常会将这样的范围写成 25 <= value && value <= 35,以模仿数学符号 25 <= value <= 35 - aioobe
1
@aioobe:我欣赏这种方法,但同样地,我发现将常量放在左边的条件更难理解。在那里有一个范围类型的论点 :) - Jon Skeet
+1,如果您相信Guava不会在每次迭代时拨打电话。XD - Mister Smith
谢谢您,我以前从未听说过Guava,但我只是开始接触Java。对于目前的问题,我决定坚持使用迭代器和循环解决。我相信在将来某个时候我会再次使用Guava。 - Krishnabhadra

6
您可以使用foreach循环。
List<Integer> newList = new ArrayList<Integer>();
for (Integer value : ageList) {
    if (value >= 25 && value <= 35) {
        newList.add(value);
    }
}

4

试试这个:

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() 会删除原始数组吗? - Krishnabhadra
1
它只会删除newList中的元素,而不是原始的ageList,因为itnewList的迭代器。 - z3pr4h

1

据我所知,Java中没有内置的功能。

具体步骤如下:

  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);
    }

1

0

遍历它,只添加匹配的元素?这只需要3行代码...包括新的ArrayList声明则是4行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接