我正在尝试从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;
}
}
答案 0 :(得分:7)
查看posX
和posY
,我很好奇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)
为HashSet
,O(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 equals
和hashCode
分别使用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
..