Java Mapping ArrayList到HashMap

时间:2010-09-27 23:49:51

标签: java sorting arraylist hashmap

我给页面获取了一个ArrayList< Document>其中每个文档都有一个名为type的属性。

我不知道唯一类型或文档的数量。

我想将这个ArrayList排序为HashMap< type,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 个答案:

答案 0 :(得分:8)

// 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);
}

答案 1 :(得分:2)

我认为,而不是按类型排序,您要查找的术语是按类型索引GuavaMultimap接口用于将键映射到多个值,而无需处理值集合的麻烦。特别是,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);
  ...
}

这几乎与做:

ListMultimap<Type, Document> typeIndex = ArrayListMultimap.create();
for(Document document : documents) {
  typeIndex.put(document.getType(), document);
}

除了生成的多图是不可变的。另请注意,上述内容几乎完全等同于Mark的示例。