0

我有一个整数数组列表,想从中删除一个整数值。澄清一下:假设我有一个接收ArrayList整数的函数,并指定整数值。我需要返回从列表中删除 (value+1) 的列表。

boolean deleteFromList(ArrayList<Integer> list, Integer value)

现在,如果我这样做:

return list.remove(value+1)

编译器会抱怨,因为它会尝试调用带int参数的 delete 方法并从指定位置删除对象,而不是实际对象。那么处理这个问题的正确方法是什么?这样做更好吗:

list.remove((Integer)(value+1))

或者

int v = value.intValue();
v++;
list.remove(new Integer(v)); 

? 在第二种情况下,我可以确定正确的值会被删除吗?

4

6 回答 6

2

list.remove(value+1)将在给定索引处删除。

您可以使用list.remove(Integer.valueOf(value+1))删除Integer.

Integer.valueOf(v)推荐使用,而不是new Integer(v)因为它允许为特殊值重用Integer实例(参见 javadoc)。

编辑:在装箱/拆箱方面,可以使用像 trove4j 这样的库来完全消除问题,它定义了一个动态的整数数组来存储原始值而不是数字类(参见TIntArrayList)。无需装箱,无需拆箱,GC 使用率更低,性能更佳。

于 2013-11-10T11:47:06.970 回答
1

在第二种情况下,我可以确定正确的值会被删除吗?

是的你可以。

remove方法将用于equals(Object)标识要从列表中删除的对象。由于Integer.equals按值比较(而不是按对象标识),因此您如何创建实例并不重要Integer……只要包装的int值相同。


但是...您的第二个版本不如第一个版本:

  • 它很麻烦:3 个语句而不是 1 个。

  • 您正在使用new Integer(...)而不是Integer.valueOf(...)总是会创建一个新实例。相比之下,自动装箱(或Integer.valueOf(...)显式调用)利用Integer类实例缓存,这通常会避免创建新实例。

于 2013-11-10T11:49:56.493 回答
1
list.remove(Integer.valueOf(value+1));

应该可以正常工作。

于 2013-11-10T11:39:30.410 回答
0

你在找这个吗。

Collections.sort(list);
int index = list.indexOf(5);
list = list.subList(0, index-1);
System.out.println(list);
于 2013-11-10T11:47:07.453 回答
0

您可以使用 list.indexOf(value + 1) 因为该方法只接受对象。然后使用该索引删除元素。

    int i = list.indexOf(value + 1);
    list.remove(i);

如果您需要删除 value + 1 的所有实例,则继续直到 i 为 -1(未找到)。

或者,只需对其进行迭代并在找到它们时将其删除

    for (Iterator<Integer> iterator = list.iterator(); iterator.hasNext(); ) {
        Integer integer = iterator.next();
        if (integer == value + 1) {
            iterator.remove();
        }
    }
于 2013-11-10T11:47:08.313 回答
0

一种更有效的方法可能是使用TIntArrayList来自Trove4j库的包装int[]数组并且不使用包装器类型的库。出于这个原因,它占用的内存少了 3 倍,而且速度更快。

于 2013-11-10T11:48:52.610 回答