鉴于课程:
public class CategoryValuePair
{
String category;
String value;
}
一种方法:
public Map<String,List<String>> convert(CategoryValuePair[] values);
鉴于在values
我们可以收到许多具有相同类别的条目,我想将这些条目转换为Map
类别分组。
是否有快速/有效的方式来执行此转换?
答案 0 :(得分:2)
据我所知,没有比迭代值更简单的方法,然后将值放在地图中(就像某些预定义的方法)。
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>
,因为我似乎更容易使用它,因此您不必为数组大小调整而烦恼。
答案 1 :(得分:1)
要使用更少的代码行,请使用Google Collections:
public 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();
}
如果您不想允许重复值,请将ArrayListMultimap替换为HashMultimap。
答案 2 :(得分:1)
使用lambdaj,您只需要一行代码即可实现以下结果:
group(values, by(on(CategoryValuePair.class).getCategory()));
答案 3 :(得分:0)
只是为了实现...该方法返回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;
}