2014-05-18 54 views
0

我有一組聲明如下LinkedHashSet以降序排列元素?

Set<String> orderSet = new LinkedHashSet <String>(); 

存儲的字符串值的日期和時間約定的組合

orderSet.add(bean.getDate()+"," + bean.getTimeConvention()); 

我總是得到輸出作爲插入順序,這就是爲什麼linkedHashSet是專爲

我需要的輸出是相反的順序,以便最新的日期第一?

我聽說過NavigableSet,但它不適合我的場景。 有什麼建議嗎?

感謝

+2

_「我聽說過NavigableSet的這隻能僅整數元素用」你從哪裏聽說_? –

+2

NavigableSet < - 它需要一切 –

+0

我試着用整數作爲elements.destrySet()作爲例子。它工作正常。但與字符串,我得到一個未定義的錯誤..所以我在這樣一個結論。如果它不' t成立。 – jaggs

回答

1

這是我會怎麼做:

import java.util.Date; 
import java.util.Map; 
import java.util.NavigableSet; 
import java.util.TreeSet; 

public class DescendingSetTest { 
    public static void main(String[] args) {   
     NavigableSet<Map.Entry<Date, String>> set = new TreeSet<Map.Entry<Date, String>>(); 

     set.add(newEntry(new Date(0), "0000")); 
     set.add(newEntry(new Date(700000000000l), "0000")); 
     set.add(newEntry(new Date(700000000000l), "9999")); 

     for (Map.Entry<Date, String> entry : set.descendingSet()) 
      System.out.println(entry); 
    } 

    public static <K extends Comparable<? super K>, V extends Comparable<? super V>> Map.Entry<K, V> newEntry(K key, V value) { 
     return new Entry<K, V>(key, value); 
    } 

    private static class Entry<K extends Comparable<? super K>, V extends Comparable<? super V>> implements Map.Entry<K, V>, Comparable<Entry<K, V>> { 
     private K key; 
     private V value; 

     Entry(K key, V value) { 
      this.key = key; 
      this.value = value; 
     } 

     @Override 
     public K getKey() { 
      return key; 
     } 

     @Override 
     public V getValue() { 
      return value; 
     } 

     @Override 
     public V setValue(V value) { 
      throw new UnsupportedOperationException(); 
     } 

     @Override 
     public int compareTo(Entry<K, V> that) { 
      int c = key.compareTo(that.key); 
      return c != 0 ? c : value.compareTo(that.value); 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     public boolean equals(Object that) { 
      return that instanceof Entry<?, ?> ? compareTo((Entry<K, V>)that) == 0 : false; 
     } 

     @Override 
     public String toString() { 
      return key + "," + value; 
     } 
    } 
} 
+0

爲什麼不直接使用TreeSet和Comparator? – CKing

+0

這個想法是一般地解決它。但是,您也可以創建一個返回通用比較器的方法。但是,我通常更喜歡這樣的東西,因爲這樣可以很容易地打印和比較集合之外的條目。 – pscuderi

2

根據javadoc的一組的目的是爲了消除元素的集合中重複。爲了顛倒集合的元素,你需要首先創建一個List。以下是示例:

ArrayList<String> list = new ArrayList<String>(orderSet); 
Collections.reverse(list); 
+0

讓我試試你的建議。謝謝 – jaggs

2

LinkedHashSet按插入順序排序。如果您按順序(例如從數據庫中的查詢)獲取內容,則會維護您獲取它們的順序,併爲您提供O(1)查找(與TreeSet的O(log n)進行比較)。當對象的排序不容易比較時,它也很有用。

LinkedHashSet對高速緩存也特別有用(也可參見其親屬LinkedHashMap,它爲removeEldestEntry提供了一種方法,可用於實現LRU高速緩存(驅逐對象以僅保留100個(或其配置的任何內容))最近使用過的物品)。

然而,LinkedHashSet是不是接口NavigableSet的子類。這意味着,許多用於操縱一組工具是不存在的。爲了扭轉NavigableSet,你可以得到descendingIterator()descendingSet()。在那裏還有其他一些比特,比如能夠獲得下一個最高值的東西,或者從一個點到另一個點的子集。

有兩個類實現NavigableSet:ConcurrentSkipListSet(使用skip list)和TreeSet(它使用紅黑樹)。

的的NavigableSet的要求是元素有一個排序它們(由Comparable實施。這些措施包括StringDate,以及各種數班,和whole bunch more ...或就此而言,任何要實現媲美。

注意,這些都是這意味着只有一個在結構元素的副本,如果你有多個副本列表後,實際上,你有你的可以使用的列表。這些是用於不同目的的不同工具。

+0

@MichealT非常翔實。謝謝 – jaggs

+0

作爲一個筆記,*親自*我喜歡SkipList。它是一個整潔的數據結構,在鏈表中使用。這使得像遍歷元素一樣簡單得多的方法(你只是使用'底部'列表)而不是搞亂TreeSet的遞歸。 –