2013-10-12 3 views
2

У меня есть система, которая включает в себя загрузку объектов PlayerValue. Объекты отформатированы как таковые: значение [Header]. Я сохранил их в текстовом файле, и всякий раз, когда я сохраняю или читаю из файла, я хочу удалить дубликаты заголовков. Так что я сделал это:Итерация с двойным вложенным циклом (ArrayList)

первым, я загружаю все PlayerValues ​​из файла в ArrayList под названием «массив», то:

for (PlayerValue v : array) { 
      for (PlayerValue v1 : array) { 
       if (v1.header.equals(v.header)) { 
        array.remove(v1); 
       } 
      } 
     } 

Здесь вы можете увидеть, он проходит через каждый элемент массива , то для каждого элемента он снова ищет массив для одного и того же заголовка.

Это эффективно удалит дубликаты заголовков, за исключением того, что он выдает исключение ConcurrentModificationException.

Любая помощь для работы вокруг?

+0

использовать набор таких как HashSet, а чем ArrayList. Наборы не позволяют дублировать. В противном случае, чтобы удалить из коллекции во время итерации, используйте Iterator. –

+0

Я мог бы обрабатывать повторяющиеся записи, но два PlayerValues ​​могут иметь один и тот же заголовок с разными значениями (что делает их неравными), а метод ArrayList.contains игнорирует его. – zfollette

+0

@HovercraftFullOfEels Единственная проблема заключается в том, что он хочет удалить дубликаты на основе некоторого атрибута, а не только на основании того, являются ли объекты равными. – arshajii

ответ

2

Даже если это сработало, было бы неплохо удалить дубликаты. Лучший вариант был бы иметь Map<Header, PlayerValue>:

Map<String, PlayerValue> map = new HashMap<>(); 

for (PlayerValue v : array) 
    map.put(v.header, v); 

Теперь вы можете перебирать записи этой карты, которая не будет содержать дубликаты ключей (заголовки):

array.clear(); 

for (Entry<?, PlayerValue> e : map.entrySet()) 
    array.add(e.getValue()); 
+0

Заголовок не является отдельным объектом, это атрибут PlayerValue. – zfollette

+0

@LegendOfFailure Что это такое, 'String'? – arshajii

+0

Да, это так. поэтому вы не можете использовать «Заголовок» в объекте ввода карты <> – zfollette

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