高效过滤列表

时间:2015-07-02 14:20:24

标签: java list dictionary guava list-comprehension

我有MyStruct。让我们称之为List<A>。现在,班级newList有2个属性Aid。现在,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。有什么帮助吗?

2 个答案:

答案 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