Преобразовать список объектов в хэш-карту в Java - PullRequest
0 голосов
/ 04 февраля 2011

У меня есть Java List<Object>, и каждый объект представляет собой строку, содержащую строку и целое число. У меня нет контроля над списком, так как он возвращается методом API.

Я бы хотел привести Список на Карту. Каков наилучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 04 февраля 2011

«Приведение», то есть обработка списка как чего-то другого типа, не будет работать, если объект, возвращаемый API, также не реализует Map (чего, очевидно, нет). Но вы можете создать карту из содержимого списка.

Furter: список не может содержать <String, Integer>, так как списки содержат только объекты одного типа. Я полагаю, он содержит такой объект:

public class Element {
  public String key;
  public Integer value;
}

Для таких вещей очевидное решение таково:

Map<String, Integer> map = new HashMap<String, Integer>(list.size()); // the size of the map will be the size of the list.
for(Element e: list) {
  map.put(e.key, e.value);
}

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

class ListTranslatorMap extends AbstractMap<String, Integer> {

  private List<Element> list;

  public ListTranslatorMap(List<Element> list) {
    this.list = list;
  }

  public Set<Map.Entry<String, Integer>> entrySet() {
    return new AbstractSet<Map.Entry<String, Integer>>() {
      public int size() {
        return list.size();
      }

      public Iterator<Map.Entry<String, Integer>> iterator() {
        final Iterator<Element> listIterator = list.iterator();
        return new Iterator<Map.Entry<String, Integer>>() {
          public boolean hasNext() {
            return listIterator.hasNext();
          }

          public void remove() {
            listIterator.remove();
          }

          public Map.Entry<String, Integer> next() {
            final Element element = listIterator.next();
            return new Map.Entry<String, Integer>() {
              public String getKey() {
                return element.key;
              }
              public Integer getValue() {
                return element.value;
              }
              public Integer setValue(Integer value) {
                Integer prev = element.value;
                element.value = value;
                return prev;
              }
            };
          }
        };
      }
    };
  }

}

Но обычно это было бы излишним, и достаточно простого перевода цикла for. Если вам нужно больше способов работы с картами - или если это не карта, а мультикарта с ключом и несколькими записями), взгляните на библиотеки Google Guava , которые имеют удобный индекс функции в com.google.common.collect.Maps .

2 голосов
/ 04 февраля 2011

Создайте карту того типа, который вам нравится (HashMap, TreeMap, HashTable, ...), а затем переберите свой список и добавьте все элементы по одному.

Нет лучшего способа (кроме случаев, еслиВы готовы написать свою собственную карту, которая подкреплена этим списком, что - в некоторых случаях - было бы действительно хорошо).

Вы МОЖЕТЕ установить некоторые параметры для типа вашей карты перед добавлением элементов (например, установитьразмер), потому что вы уже знаете, сколько элементов добавить.Это может немного увеличить производительность.Зависит от вашего варианта использования.

РЕДАКТИРОВАТЬ: Я сказал это, потому что я понимаю ваш вопрос таким образом, что ваши списки содержат POJO со строкой и целочисленным атрибутом.Если это не так, то ответ может быть другим.

0 голосов
/ 04 февраля 2011

Не уверен, что вы имеете в виду, когда объект является <String, Integer>, но если это карта, вот код:

Map<String,Integer> map=new Hasmap<String, Integer>();
for(Object o:list){
  Map<String,Integer> m=(Map<String,Integer>)o
  map.putAll(m)
}

вы можете потерять данные при переопределении ключа, хотя

0 голосов
/ 04 февраля 2011

Зациклите список и сохраните их на новой карте:

    Map<String, Integer> result = new HashMap<String, Integer>();
    for(Map<String,Integer> item : list){
        result.putAll(item);
    }

Обратите внимание, что если в списке несколько элементов с одинаковым ключом строки, они будут перезаписывать друг друга на карте.

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