给定以下类:
public class CategoryValuePair
{
String category;
String value;
}
还有一个方法:
public Map<String,List<String>> convert(CategoryValuePair[] values);
考虑到在values
中我们可能会收到许多具有相同类别的条目,我想将它们转换为以类别分组的Map
。
有没有一种快速/高效的方法来执行这个转换?
给定以下类:
public class CategoryValuePair
{
String category;
String value;
}
还有一个方法:
public Map<String,List<String>> convert(CategoryValuePair[] values);
考虑到在values
中我们可能会收到许多具有相同类别的条目,我想将它们转换为以类别分组的Map
。
有没有一种快速/高效的方法来执行这个转换?
Map<String, List<String>> map = new HashMap<String, List<String>>();
if (values != null) {
for (CategoryValuePair cvp : values) {
List<String> vals = map.get(cvp.category);
if (vals == null) {
vals = new ArrayList<String>();
map.put(cvp.category, vals);
}
vals.add(cvp.value);
}
}
我将地图的值从String[]
更改为List<String>
,因为我认为使用它更容易,这样您就不必担心数组调整大小的问题。
if (vals == null) { vals = new ArrayList<String>(); map.put(cvp.category, vals); }
- user85421public Map<String, Collection<String>> convert(CategoryValuePair[] values) {
Multimap<String, String> mmap = ArrayListMultimap.create();
for (CategoryValuePair value : values) {
mmap.put(value.category, value.value);
}
return mmap.asMap();
}
使用lambdaj,您只需要一行代码即可实现以下结果:
group(values, by(on(CategoryValuePair.class).getCategory()));
Map
,并且还会检查数组中是否有重复项... 尽管从性能方面来看它比较耗费资源...public Map<String,String[]> convert(CategoryValuePair[] values)
{
Map<String, String[]> map = new HashMap<String, String[]>();
for (int i = 0; i < values.length; i++) {
if(map.containsKey(values[i].category)){
Set<String> set = new HashSet<String>(Arrays.asList(map.get(values[i].category)));
set.add(values[i].value);
map.put(values[i].category, set.toArray(new String[set.size()]));
}else {
map.put(values[i].category, new String[]{values[i].value});
}
}
return map;
}
String[]
而不是List<String>
在你的 map 中有什么特别的原因吗?我想不出很多理由,为什么数组会更好,就你的问题而言,按照我的思路,列表会使它变得更容易一些。 - Lauri Lehtinen