Удалить int [] из ArrayList - PullRequest
       5

Удалить int [] из ArrayList

2 голосов
/ 05 марта 2010

Я пытаюсь удалить int [] из ArrayList.Из-за моего кода у меня есть только значения, поэтому я создаю массив и затем вызываю 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 ]

7 голосов
/ 05 марта 2010

Неправильно использовать массивы для хранения данных, которые не являются последовательностью элементов, в буквальном смысле.

Ваш массив на самом деле является держателем данных с двумя различными полями. Определите класс координат и переопределите Object.equals(Object). Тогда ваш код станет намного чище:

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

Вы должны догадаться, как определить MyPoint ..

7 голосов
/ 05 марта 2010

Глядя на 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 Edition *)1032 *, пункт 25: предпочесть списки массивам).Он имеет поведение equals, которое вам нужно.Это медленнее, но все же может быть достаточно быстрым.

Наконец, если вы настаиваете на использовании int[], вы можете просто обернуть его в свой собственный класс IntArray и вместо него иметь ArrayList<IntArray>.@Override equals и hashCode для использования Arrays.equals(int[], int[]) и hashCode(int[]) соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...