2015-07-02 85 views
0

我有一個List<A>。我們稱它爲newList。現在類A有2個屬性idweight。現在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)什麼是已經存在的值(權重)和覆蓋如果我現在的價值更大。雖然這很好。我想可能會有一些更優雅的列表理解,我可以嘗試用番石榴。任何幫助?

+0

你可以使用Java 8嗎?番石榴可能會有點困難。 –

回答

0

這是我能想到利用番石榴的最佳解決方案:

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()); 
} 

這似乎是

過度的情況相比較,以香草使用番石榴的函數式編程習慣用法會導致冗長,混亂,不可讀和低效的代碼。這是目前爲止 番石榴的最容易的(也是最常見的)濫用的部分,當 你去荒謬的長度,以使你的代碼「一行代碼」的 番石榴隊哭泣

如果有人可以在Java 8中提出解決方案,這將有所幫助。

-2

嗨,你使用FilterCriteria來實現這個任務。

有關示例,請參閱link

+0

此鏈接指向2004年的一篇文章(!),沒有泛型,也沒有公共庫... – Xaerxess