2014-03-13 40 views
44

對於列表,我們使用Collections.sort(List)方法。如果我們想要排序HashSet怎麼辦?如何排序HashSet?

+13

「HashSet」是一個無序集合。 –

+1

由於'Set'沒有隨機訪問方法(即給定索引處的'.get()'元素),所以你不能這樣做,這對於排序算法來說基本上是必需的;) – fge

+2

你可以將它轉換爲先列出然後排序,如果您需要排序 – demongolem

回答

9

使用java.util.TreeSet作爲實際對象。當你迭代這個集合時,這些值會以一個明確定義的順序返回。

如果您使用java.util.HashSet那麼順序取決於一個內部函數,而不是可能不是詞法。

+0

你爲什麼假設他們存儲'String'值? –

+0

雖然我可能沒有使用Lexicalography,但是它並不精確;-) –

+3

這是非常錯誤的。它不以按照詞典(sp?)的順序存儲密鑰。它要麼使用它們的自然順序(這取決於按鍵實現的「Comparable」接口),還是使用提供的「比較器」。 –

56

HashSet不保證其元素的任何順序。如果您需要此保證,請考慮使用TreeSet來保存您的元素。

但是如果你只需要排序爲這一個發生您的要素,然後只是暫時創建列表和排序是:

Set yourHashSet = new HashSet(); 

... 

List sortedList = new ArrayList(yourHashSet); 
Collections.sort(sortedList); 
33

所有對象添加到TreeSet,你會得到一個有序集合。以下是一個原始示例。

HashSet myHashSet = new HashSet(); 
myHashSet.add(1); 
myHashSet.add(23); 
myHashSet.add(45); 
myHashSet.add(12); 

TreeSet myTreeSet = new TreeSet(); 
myTreeSet.addAll(myHashSet); 
System.out.println(myTreeSet); // Prints [1, 12, 23, 45] 
-4

這個簡單的命令做了伎倆對我來說:

myHashSet.toList.sorted 

我用這個打印語句中,所以如果你需要真正的持續的訂貨,您可能需要使用TreeSets或其他結構在這個線程上提出。

+1

我看不到HashSet或Set在哪裏有一個方法'toList'。 –

+1

它在Spark Shell中工作 –

+1

對我來說這看起來像Scala,但不幸的是,這並不能解決Java中的問題。 – Roberto

0

HashSet中的元素無法排序。無論何時將元素放入HashSet中,都會弄亂整個桶。關於它的好處是性能上的效率。

TreeSet會在您每次插入元素時自動對所有元素進行排序。

也許,你要做的只是排序一次。在這種情況下,TreeSet不是最好的選擇,因爲它需要一直確定添加新元素的位置。

最有效的解決方案是使用ArrayList。創建一個新列表並添加所有元素,然後對其進行排序。如果你想只保留獨特的元素(除去像集合中的所有副本呢,然後把名單到LinkedHashSet,它會保留你已經排序的順序)

List<Integer> list = new ArrayList<>(); 
list.add(6); 
list.add(4); 
list.add(4); 
list.add(5); 
Collections.sort(list); 
Set<Integer> unique = new LinkedHashSet<>(list); // 4 5 6 
// The above line is not copying the objects! It only copies references. 

現在,你已經得到了有序集合如果你想以列表的形式,然後將其轉換爲列表。

0

您可以通過以下方式做到這一點:

方法1:

  1. 創建一個列表,所有的HashSet的值存儲到它
  2. 排序使用集合列表。排序()
  3. 存儲列表返回到LinkedHashSet因爲它保留了插入順序

方法2:

  • 創建一個TreeSet,所有的值存儲進去。

方法2是更優選的,因爲其他方法消耗大量時間來在哈希集和列表之間來回傳送數據。

3

您可以像其他答案中提到的那樣使用TreeSet。

下面是關於如何使用多一點的闡述:

TreeSet<String> ts = new TreeSet<String>(); 
ts.add("b1"); 
ts.add("b3"); 
ts.add("b2"); 
ts.add("a1"); 
ts.add("a2"); 
System.out.println(ts); 
for (String s: ts) 
    System.out.println(s); 

輸出:

[a1, a2, a3, a4, a5] 
a1 
a2 
b1 
b2 
b3 
0
1. Add all set element in list -> al.addAll(s); 
2. Sort all the elements in list using -> Collections.sort(al); 


public class SortSetProblem { 
public static void main(String[] args) { 
    ArrayList<String> al = new ArrayList(); 
    Set<String> s = new HashSet<>(); 
    s.add("ved"); 
    s.add("prakash"); 
    s.add("sharma"); 
    s.add("apple"); 
    s.add("ved"); 
    s.add("banana"); 
    System.out.println("Before Sorting"); 
    for (String s1 : s) { 
     System.out.print(" " + s1); 
    } 

    System.out.println("After Sorting"); 
    al.addAll(s); 
    Collections.sort(al); 
    for (String set : al) { 
     System.out.print(" " + set); 
    } 
    } 
} 

輸入 - 粘彈性阻尼器普拉卡什·夏爾馬蘋果粘彈性阻尼器香蕉

輸出 - 蘋果香蕉prakash sharma ved

0

可以使用番石榴庫爲同一

Set<String> sortedSet = FluentIterable.from(myHashSet).toSortedSet(new Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     // descending order of relevance 
     //required code 
    } 
}); 
1

的Java 8的排序方式將是:

fooHashSet.stream() 
    .sorted(Comparator.comparing(Foo::getSize)) //comparator - how you want to sort it 
    .collect(Collectors.toList()); //collector - what you want to collect it to 

* Foo::getSize這是一個例子如何YourItem的的HashSet的自然排序尺寸。

* Collectors.toList()是要收集整理成一個列表中,您將需要​​

0

捕捉到它,我們不能決定一個HashSet的元素將被自動排序的結果。但我們可以通過轉換爲TreeSet或任何列表(如ArrayList或LinkedList等)對它們進行排序。

// Create a TreeSet object of class E 
TreeSet<E> ts = new TreeSet<E>(); 

// Convert your HashSet into TreeSet 
ts.addAll(yourHashSet); 

System.out.println(ts.toString() + "\t Sorted Automatically");