有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从ArrayList中删除int[]

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

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

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

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

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

共 (2) 个答案

  1. # 1 楼答案

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

    您的数组实际上是一个具有两个不同feld的数据保持器。 定义一个坐标类并重写Object.equals(Object)。然后,您的代码将变得更加干净:

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

    您应该猜测如何定义MyPoint

  2. # 2 楼答案

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

    remove找不到数组的原因是新数组与集合中已存在的数组不匹配

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

    如果您创建了自己的Point类,那么您可以@Override equals按照自己的意愿进行操作,并且只需调用remove(new Point(posX, posY))

    您也应该考虑有一个^ {CD9>},因为实现提供了更快的移除(^ {CD10>}对于^ {CD11>},^ {CD12>} ^ ^ })。记住@Override hashCode(如果你@Override equals,你无论如何都必须这么做),如果你想使用TreeSet或者需要在其他上下文中对点进行排序,那么就制作Point implements Comparable<Point>(或者提供一个外部Comparator<Point>

    如果您的^ {< CD19>}有很多元素,并且自定义^ {< CD6>}类不适用,那么您可能需要考虑切换到^ {CD21>}(参见:有效java第二版< EEM>,项目25:首选列表到数组)。它具有您需要的equals行为。速度较慢,但可能仍然足够快

    最后,如果您坚持使用int[],您可以将其包装到您自己的IntArray类中,并使用ArrayList<IntArray>@Override equals和{}分别使用{}和{}