2010-03-05 2 views
2

Я пытаюсь удалить int [] из ArrayList. Из-за моего кода у меня есть только значения, поэтому я создаю массив, а затем вызываю remove();Удалить int [] from ArrayList <int[]>

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

positionList является corrisponding ArrayList

Это на самом деле не работает. Есть еще одна возможность, чем итерация по списку как

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

ответ

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> вместо (см также: Эффективного Java 2-е издание, пункт 25: предпочитают списки массивы). Он имеет поведение equals, которое вам нужно. Он медленнее, но он может быть достаточно быстрым.

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

+1

+1 за предложение использовать HashSet вместо List. ArrayList, безусловно, самый неэффективный сбор для специальных удалений. –

+0

Да, я стараюсь по-разному покрывать все соответствующие базы в моих ответах. – polygenelubricants

+1

+1 на столько уровней. –

7

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

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

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

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

+0

или еще лучше использовать фактический класс Point2D или Point в JDK, http://java.sun.com/javase/6/docs/api/java/awt/geom/Point2D.html – basszero

+2

Не забудьте переопределить Object # hashCode() тоже! http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java –

+0

В Point2D есть две проблемы. Сначала это абстрактно, поэтому Димитрию нужно было бы написать класс в любом случае. Во-вторых, он использует удвоения, в то время как Dimitri использует целые числа. Моим общим моментом было использование структур данных вместо массивов. –

Смежные вопросы