列表的高效过滤
Efficient filtering of list
我有一个List<A>
。让我们称之为 newList
。现在 class A
有两个属性 id
和 weight
。现在 newList
包含 A
类型的各种条目。我想要的是一个包含 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:1->weight:12
id:2->weight:7
我目前正在做的是一个一个地迭代列表并检查给定的键(id)什么是已经存在的值(权重),如果我的当前值更大则覆盖。虽然这很好。我想我可以尝试使用 Guava 进行一些更优雅的列表理解。有帮助吗?
您好,您使用 FilterCriteria 来完成此任务。
请参考link一些例子。
这是我能想到的使用 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));
}
将其与原版进行比较 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());
}
这似乎是
的情况
Excessive use of Guava's functional programming idioms can lead to
verbose, confusing, unreadable, and inefficient code. These are by far
the most easily (and most commonly) abused parts of Guava, and when
you go to preposterous lengths to make your code "a one-liner," the
Guava team weeps
如果有人能在 Java 8 中提出解决方案,那将会有所帮助。
我有一个List<A>
。让我们称之为 newList
。现在 class A
有两个属性 id
和 weight
。现在 newList
包含 A
类型的各种条目。我想要的是一个包含 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:1->weight:12
id:2->weight:7
我目前正在做的是一个一个地迭代列表并检查给定的键(id)什么是已经存在的值(权重),如果我的当前值更大则覆盖。虽然这很好。我想我可以尝试使用 Guava 进行一些更优雅的列表理解。有帮助吗?
您好,您使用 FilterCriteria 来完成此任务。
请参考link一些例子。
这是我能想到的使用 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));
}
将其与原版进行比较 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());
}
这似乎是
的情况Excessive use of Guava's functional programming idioms can lead to verbose, confusing, unreadable, and inefficient code. These are by far the most easily (and most commonly) abused parts of Guava, and when you go to preposterous lengths to make your code "a one-liner," the Guava team weeps
如果有人能在 Java 8 中提出解决方案,那将会有所帮助。