我给页面获取了一个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
}
我知道这是错误的做法,显然不会奏效。我对任何建议持开放态度。
谢谢
答案 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)
我认为,而不是按类型排序,您要查找的术语是按类型索引。 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);
...
}
这几乎与做:
ListMultimap<Type, Document> typeIndex = ArrayListMultimap.create();
for(Document document : documents) {
typeIndex.put(document.getType(), document);
}
除了生成的多图是不可变的。另请注意,上述内容几乎完全等同于Mark的示例。