从ArrayList <int []> </int []>中删除int []

时间:2010-03-05 16:30:38

标签: java arraylist

我正在尝试从ArrayList中删除int []。 由于我的代码我只有值,所以我正在创建数组,然后调用remove();

int[] pos = new int[]{0,1};
positionList.remove(pos);

positionList是相应的ArrayList

这实际上不起作用。还有其他可能性,而不是遍历列表,如

for (int[] pos : positionList) {
  if (posX == pos[0] && posY == pos[1]) {
    positionList.remove(pos);
    break;
  }
}

2 个答案:

答案 0 :(得分:7)

查看posXposY,我很好奇ArrayList<Point>之类的内容是否适合您。

remove无法找到数组的原因是因为新数组不是集合中已有数组的equals

(new int[0]).equals(new int[0]) // false!

如果您创建了自己的Point课程,那么您可以@Override equals按照自己的意愿行事,而只需拨打remove(new Point(posX, posY))

您还应该考虑使用Set<Point> positionList,因为实施提供了更快的删除速度(O(1)HashSetO(log N)TreeSet。请记住@Override hashCode(如果您@Override equals,则必须执行此操作),如果您要使用Point implements Comparable<Point>,请设置Comparator<Point>(或提供外部TreeSet)或者需要在其他环境中对点进行排序。

如果您的int[]包含许多元素且自定义Point类不适用,那么您可能需要考虑切换到List<Integer>(另请参阅: Effective Java 2nd版本,第25项:首选列表到数组)。它具有您需要的equals行为。它速度较慢,但​​可能仍然足够快。

最后,如果您坚持使用int[],则可以将其包装在自己的IntArray课程中,并改为使用ArrayList<IntArray>@Override equalshashCode分别使用Arrays.equals(int[], int[])hashCode(int[])

答案 1 :(得分:7)

使用数组来保存非项目序列的数据是不好的做法。

您的阵列实际上是一个拥有两个不同领域的数据持有者。 定义坐标类并覆盖Object.equals(Object)。那么你的代码将变得更加清晰:

ArrayList<MyPoint> positionList;
// fill list
MyPoint testPos = new MyPoint(0, 1);
positionList.remove(testPos);

您应该猜测如何定义MyPoint ..