2012-10-28 24 views
4

我想用一個值比較器將項目插入到HashMap,TreeMap或SortedMap中(您可能會建議其他一些API)。Java Map Value Comparator,在插入時排序

我讀過很多帖子,包括這個one,大多數帖子都建議在插入所有項目後,將HashMap重新插入帶值Comparator的SortedMap。

我不想重新插入所有值。是不是有一個選項或地圖類似的數據結構支持每次插入後激活一個值比較器?

如果有重複的問題,我將不勝感激的鏈接(我已經做了一些搜索,雖然我可能已經錯過了一些)

同樣,我很感興趣,加上一個值,以某種有序的地圖等等在每次插入後,所有項目都將按值排序,而不是按鍵排序。

Map條目中的值實際上是一個帶有一些getter的複雜對象,我只想按值對象上的特定getter排序。

+0

你可以插入項目成[TreeMap中(http://docs.oracle.com/javase/6/docs/api/java/util /TreeMap.html)並在其構造函數中爲TreeMap提供所需的比較器?完全如您已經鏈接到的問題所示。 – DNA

+0

爲什麼你不喜歡你在問題中提到的答案?你需要一個有序的地圖 - 使用TreeMap。您需要按照所建議的值使用valuecomparator中的特定字段進行比較,實施會略有變化,但比例仍然相同。 –

+0

@MarkBramnik那些地圖傳遞的鍵不是值,對吧? –

回答

3

我雖然有一些解決方法,但它不是完美的,並且會使用更多的內存,但它相當簡單。

我可以擴展Map的鍵值來保存Value對象的getter返回的值,然後我將擴展鍵Comparator按鍵的正確元組進行排序。

UPDATE

曾擔任魅力非常不錯的表現。

+0

如果密鑰保存了該值,那麼如何從地圖中檢索值?您需要知道排序值才能獲取對象值? – ygesher

2

地圖都是從關鍵到價值。番石榴有一個概念bidirectional mappings,但你並不真正關心從價值到關鍵,而是暴露價值的有序迭代。我推薦的是一個自定義容器,它將同時容納一個HashMap和一個Priority Queue

因此,擴展Map,Collection和Iterable接口,並將其添加到HashMap和Priority Queue中。迭代時,在搜索/轉到地圖時迭代隊列。

+0

感謝您的解決方案。 – Michael

+0

我會感謝您對我的解決方案的評論。 – Michael

3

我想你需要的是org.apache.commons.collections.bidimap.TreeBidiMap

紅黑基於樹的實施BidiMap,其中添加的所有對象實現Comparable接口。

該類保證地圖將按升序鍵順序和升序值順序排序,按照鍵和值的類的自然順序排序。

+0

感謝您的解決方案,我寧願不使用任何外部庫。 – Michael

1

我正在尋找類似的東西,但無法使用TreeBidiMap,因爲它需要Map的鍵來實現Comparable接口。

所以我寫了我自己的簡約ValueTreeMap

import java.util.HashMap; 
import java.util.Iterator; 
import java.util.TreeSet; 

public class ValueTreeMap<K, V extends Comparable<V>> implements Iterable<V> { 
    private TreeSet<V> tree = new TreeSet<V>(); 
    private HashMap<K, V> map = new HashMap<K, V>(); 

    public void put(K key, V value){ 
     V oldValue = map.get(key); 
     if(oldValue != null){ 
      tree.remove(oldValue); 
     } 
     tree.add(value); 
     map.put(key, value); 
    } 

    public V get(K key){ 
     return map.get(key); 
    } 

    @Override 
    public Iterator<V> iterator() { 
     return tree.iterator(); 
    } 

} 
+1

我擴展了你的解決方案來構建一個實現'Map'的類:[github](https://github.com/jegesh/cn1-object-cacher/blob/master/src/net/gesher/cn1/caching/ValueTreeMap的.java) – ygesher