我有MyStruct
。让我们称之为List<A>
。现在,班级newList
有2个属性A
和id
。现在,weight
包含newList
类型的各种条目。我想要的是一个包含A
的Map,以便映射特定id->weight
的最重(最重的是具有最高权重值的实例)实例。
id
地图应为
Example say the List contains the following objects:
obj1: id=1 weight=5
obj2: id=1 weight=10
obj3: id=1 weight=12
obj4: id=2 weight=6
obj5: id=2 weight=7
我目前正在做的是逐个迭代列表并检查给定的键(id)已存在的值(权重)是什么,如果我的当前值更大则覆盖。虽然这很好。我想可能会有一些更优雅的List理解我可以尝试使用Guava。有什么帮助吗?
答案 0 :(得分:0)
这是我能想到使用Guava的最佳解决方案:
Map<Integer,Integer> finalMap=Maps.newHashMap();
Multimap<Integer,A> newMap=Multimaps.index(newList, new Function<A,Integer>(){
public Integer apply(A input) {
return input.getId();
}
});
for(Integer i:newMap.keySet()){
List<Integer> z=FluentIterable.from(newMap.get(i))
.transform(new Function<A,Integer>(){
public Integer apply(A input) {
return input.getWeight();
}
}).toList();
finalMap.put(i, Collections.max(z));
}
将它与vanilla Java 6进行比较
Map<Integer,Integer> finalMap=new HashMap<Integer,Integer>();
for(A a:newList){
if(finalMap.get(a.getId())!=null){
finalMap.put(a.getId(),finalMap.get(a.getId())>a.getWeight()?finalMap.get(a.getId()):a.getWeight());
}
finalMap.put(a.getId(), a.getWeight());
}
这似乎是
的情况过度使用Guava的函数式编程习语可能导致 冗长,混乱,不可读和低效的代码。到目前为止 番石榴最容易(也是最常见)滥用的部分,何时 你去做荒谬的长度,使你的代码“一个单行”, 番石榴队哭泣
如果有人能在Java 8中提出解决方案,那将会有所帮助。
答案 1 :(得分:-2)
您好使用FilterCriteria来完成此任务。
有关示例,请参阅link。