Java 从ArrayList中删除int[<;int[]>;

Java 从ArrayList中删除int[<;int[]>;,java,arraylist,Java,Arraylist,我正在尝试从ArrayList中删除int[]。 由于我的代码,我只有这些值,所以我正在创建数组,然后调用remove() 位置列表是对应的阵列列表 这实际上不起作用。除了像这样反复浏览列表,还有其他可能性吗 for (int[] pos : positionList) { if (posX == pos[0] && posY == pos[1]) { positionList.remove(pos); break; } } 看看posX和posY,我很

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

位置列表是对应的阵列列表

这实际上不起作用。除了像这样反复浏览列表,还有其他可能性吗

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

看看
posX
posY
,我很好奇像
ArrayList
这样的东西对您来说是否是更好的解决方案

remove
找不到数组的原因是新数组与集合中已有的数组不相等

(new int[0]).equals(new int[0]) // false!
如果您创建自己的
类,那么您可以
@覆盖equals
以按照您的需要进行操作,并且您只需调用
移除(新点(posX,posY))

您也应该考虑使用<代码>设置位置列表< /代码>,因为实现提供了更快的移除(<代码> O(1)< /代码> < <代码> HASSESET <代码> > <代码> O(log n)< />代码>代码>树目录。请记住

@覆盖hashCode
(如果
@覆盖等于
,则无论如何都必须这样做),如果要使用
树集
或需要在其他上下文中对点进行排序,请使
点实现可比
(或提供外部
比较器

如果您的<代码> INT[] /Cux>有很多元素,并且自定义<代码>点< /代码>类不适用,那么您可能需要考虑切换到List(参见:有效java第二版,项目25:首选列表到数组)。它具有您需要的
等于
的行为。速度较慢,但可能仍然足够快


最后,如果您坚持使用
int[]
,您可以将其包装在自己的
IntArray
类中,并使用
ArrayList
@Override equals
hashCode
分别使用
数组。equals(int[],int[])
hashCode(int[])

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

您的数组实际上是一个具有两个不同feld的数据保持器。 定义坐标类并覆盖
对象。等于(对象)
。然后,您的代码将变得更加干净:

ArrayList<MyPoint> positionList;
// fill list
MyPoint testPos = new MyPoint(0, 1);
positionList.remove(testPos);
ArrayList位置列表;
//填写清单
MyPoint testPos=新的MyPoint(0,1);
位置列表。移除(testPos);

您应该猜测如何定义
MyPoint

+1,以获得使用HashSet而不是列表的建议。ArrayList当然是最低效的临时删除集合。是的,我在回答中尝试以增量方式覆盖所有相关的基础。或者更好的是,在JDK中使用实际的Point2D或Point类,别忘了覆盖Object#hashCode()!Point2D有两个问题。首先,它是抽象的,因此Dimitri无论如何都需要编写一个类。其次,它使用double,而Dimitri使用整数。。我的主要观点是使用数据结构而不是数组。
ArrayList<MyPoint> positionList;
// fill list
MyPoint testPos = new MyPoint(0, 1);
positionList.remove(testPos);