2013-05-24 2 views
1

У меня есть ArrayList с кучей объектов MyObject. Я хочу сохранить целочисленное поле в моем объекте, являющемся ключом этого объекта в ArrayList, так что я могу легко получить позицию этого элемента в ArrayList.Обновить индекс ArrayList в объекте

Возникла проблема, когда я удаляю один объект из этого массива ArrayList, потому что индексы перемещаются влево. Каков наилучший способ избежать этой проблемы?

Должен ли я не удалять элементы, но переопределять их с нулевым значением (чтобы индекс не сдвигался), или я должен скорее перебирать ArrayList после одного удаления, чтобы обновить все поля ID в объектах?

// EDIT: Моя цель: Предположим, что я получаю некоторые объекты этого ArrayList и вставляю их в другой список. Позже, повторяя этот второй список, я хочу получить ключ от объектов в первом ArrayList. Поэтому я должен сохранить ключ в объекте. Где преимущества при использовании Карты в этом случае? Ключами являются только целые числа с автоматическим увеличением.

+2

Похоже, вам будет лучше использовать карту. Проверьте: http://docs.oracle.com/javase/6/docs/api/java/util/Map.html – Porkbutts

+0

Вы можете сделать это, просто используя обычный массив, но я согласен, что карта - гораздо лучший подход , – sage88

ответ

2

Вам лучше использовать Map. Карта - это объект, который отображает ключи в значения. он не может содержать дубликаты ключей; каждый ключ может отображать не более одного значения.

Итак, в вашем случае вы можете сохранить идентификатор и объект в качестве пары ключ, значение на карте. И оттуда вы можете напрямую получить доступ к объекту связанного с ним идентификатора.

+0

Каково точное различие между Map и ArrayList? Я просто хочу использовать значение auto-increment integer как ключ, так что это работает с обоими из них. Я могу получить значение, предоставив ключ с обоими из них. Так в чем же преимущество в моем случае? – freakout

+0

вы можете получить доступ к карте проще, чем id, чем arraylist. создается карта для сохранения структуры данных пары (ключ, значение). и согласно вашему вопросу, это то, что вам нужно. – stinepike

+0

См. Мое редактирование. Спасибо! – freakout

3

этого можно с помощью карты - HashMap

Пример:

Map<Integer, MyObject> map = new HashMap<Integer, MyObject>(); 
MyObject obj = new MyObject(); 
Integer key = new Integer("1234"); 
obj.setKey(key); 
map.put(obj.getKey(), obj); 

для получения объекта, звоните:

MyObject result = map.get(key); 

result = null; 

map.put(key, result); 

Каждый ключ это уникальный на карте так, если изменить значение, оно не влияет на ключ.

В этом случае вы можете сохранить ключ с нулевым значением.

В противном случае, если вы удалить индекс, и поставить его снова, будет решать:

 List<String> list = new ArrayList<String>(); 
     list.add("ONE"); 
     list.add("TWO"); 

     for (int index = 0; index < list.size(); index ++) { 
      // remove the index that you will change to null 
      list.remove(index); 
      // put a null object in that index 
      list.set(index, null); 
      System.out.println(list.get(index)); 
     } 

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

+0

См. Мое редактирование выше. Спасибо! – freakout

+0

Хорошо, я поставил другое решение ... это то, что вы ищете? –

+1

Вам не нужно удалять и добавлять его впоследствии. Просто используйте list.set (index, null), чтобы перезаписать старый элемент. Однако карта кажется лучшим решением, спасибо! – freakout

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