Отображение Java ArrayList в HashMap - PullRequest
2 голосов
/ 28 сентября 2010

У меня страница получает ArrayList , где у каждого документа есть свойство с именем type.

Я не знаю количество уникальных типов или документов.

Я хочу отсортировать этот ArrayList в HashMap <тип, document []>, но у меня возникли некоторые проблемы с его обработкой.

Какой-то псевдокод хотел бы

for (int i = 0; i < documents.size(); i++) 
{
   if there is an array for documents[i].type
   add to this array
   else create a new array for this type
   add document[i].type and the array of documents with matching type to the hashmap
}

Я знаю, что это неправильный подход и явно не сработает. Я открыт для любых предложений.

Спасибо

Ответы [ 2 ]

8 голосов
/ 28 сентября 2010
// create the map to store stuff, note I'm using a List instead of an array
// in my opinion it's a bit cleaner
Map<String, List<Document>> map = new HashMap<String, List<Document>>();

// now iterate through each document
for(Document d : documents){

    // check to see if this type is already known
    List<Document> list = map.get(d.type);

    if(list == null){
        // list is null when it wasn't found in the map
        // this is a new type, create a new list
        list = new ArrayList<Document>();

        // store the list in the map
        map.put(d.type, list);
    }

    // finally, whether we got a hit or a miss, we want
    // to add this document to the list for this type
    list.add(d);
}
2 голосов
/ 28 сентября 2010

Я думаю, что вместо сортировки по типу, вы ищете термин индексации по типу. Guava Multimap интерфейс предназначен для отображения ключей на несколько значений без всяких хлопот по работе с коллекциями значений.В частности, в Guava есть метод, предназначенный для выполнения именно того, что вы пытаетесь сделать:

List<Document> documents = ...
ImmutableListMultimap<Type, Document> typeIndex = Multimaps.index(documents,
    new Function<Document, Type>() {
      public Type apply(Document input) {
        return input.getType();
      }
    });

for(Type type : typeIndex.keySet()) {
  ImmutableList<Document> documentsWithType = typeIndex.get(type);
  ...
}

Это почти то же самое, что и:Полученная мультикарта является неизменной.Также обратите внимание, что приведенное выше почти в точности соответствует примеру Марка.

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