For lists, we use the Collections.sort(List)
method. What if we want to sort a HashSet
?

- 1,366
- 2
- 22
- 43

- 1,555
- 4
- 11
- 17
-
26A `HashSet` is an unordered collection. – Alexis C. Mar 13 '14 at 21:30
-
2You can't, since a `Set` does not have random access methods (ie, `.get()` an element at a given index), which is basically required for sort algorithms ;) – fge Mar 13 '14 at 21:44
-
5You could convert it to a list first then sort if you need to sort – demongolem Mar 13 '14 at 21:50
-
You can't since a `HashSet` doesn't have a defined order. Your question embodies a contradiction in terms. – user207421 Jun 17 '16 at 11:06
-
2use a TreeSet and if you can't control the source see the conversion an usage here https://stackoverflow.com/a/52987487/5153955 – Tendai Feb 17 '19 at 13:51
-
The following answer can be very helpful for you https://stackoverflow.com/a/59964344/7397820 – fatimasajjad Jan 30 '20 at 07:53
21 Answers
A HashSet does not guarantee any order of its elements. If you need this guarantee, consider using a TreeSet to hold your elements.
However if you just need your elements sorted for this one occurrence, then just temporarily create a List and sort that:
Set<?> yourHashSet = new HashSet<>();
...
List<?> sortedList = new ArrayList<>(yourHashSet);
Collections.sort(sortedList);

- 22,334
- 15
- 80
- 130

- 2,541
- 1
- 14
- 11
-
1Also, if you're using a collection of Strings, then `List
sortedList = new ArrayList – wisbucky May 18 '18 at 02:23(yourHashSet);` -
I got this error: The method sort(List
) in the type Collections is not applicable for the arguments (List – ceklock Jun 23 '22 at 20:52)
Add all your objects to the TreeSet
, you will get a sorted Set. Below is a raw example.
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]
Update
You can also use TreeSet
's constructor that takes a HashSet
as a parameter.
HashSet myHashSet = new HashSet();
myHashSet.add(1);
myHashSet.add(23);
myHashSet.add(45);
myHashSet.add(12);
TreeSet myTreeSet = new TreeSet(myHashSet);
System.out.println(myTreeSet); // Prints [1, 12, 23, 45]
Thanks @mounika for the update.

- 12,010
- 6
- 65
- 78
-
8By using `TreeSet myTreeSet = new TreeSet(myHashSet);` you can avoid adding all the elements to Treeset again. – Mounika Jun 05 '19 at 17:54
-
This will remove duplicates as OP asking to sort HashSet and it may contain duplicate values. – ScanQR Oct 26 '21 at 06:29
-
1
Java 8 way to sort it would be:
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
it's an example how to sort the HashSet of YourItem's naturally by size.
*Collectors.toList()
is going to collect the result of sorting into a List the you will need to capture it with List<Foo> sortedListOfFoo =

- 6,865
- 3
- 28
- 47
-
-
@Jess i dont know whats the specific order for you Jess, you can sort it as you desire using the comparator. – LazerBanana Nov 29 '19 at 11:13
-
-
Are there any advantages of doing your solution over `List> sortedList = new ArrayList<>(yourHashSet); Collections.sort(sortedList);`? – tung Jul 07 '22 at 09:57
-
3Just putting the elements wont give the flexibility of sorting on any order with any element inside it. The above solution does. – Jess Nov 05 '19 at 16:01
Use java.util.TreeSet
as the actual object. When you iterate over this collection, the values come back in a well-defined order.
If you use java.util.HashSet
then the order depends on an internal hash function which is almost certainly not lexicographic (based on content).

- 495
- 4
- 10

- 8,319
- 4
- 35
- 78
-
-
-
3It's very wrong. It doesn't store keys in lexographic (sp?) order. It either uses their natural ordering (which depends on `Comparable` interface which the keys implement) or uses the provided `Comparator`. – Sotirios Delimanolis Mar 13 '14 at 21:35
-
I've edited. Better do you think , or should I delete the answer? – P45 Imminent Mar 13 '14 at 21:37
-
-
1In case you move a `HashSet` to `TreeSet`, your class must implement `Comparable` interface or provide a custom `Comparator`. Otherwise, since you cannot sort a `HashSet`, just convert it into a `List` and sort it. – Luiggi Mendoza Mar 13 '14 at 21:40
-
I guess,I can use TreeSet with the constructor- TreeSet(Comparator super E> comparator). – Diana Mar 14 '14 at 01:57
Just in-case you don't wanna use a TreeSet
you could try this using java stream for concise code.
set = set.stream().sorted().collect(Collectors.toCollection(LinkedHashSet::new));

- 1,423
- 2
- 9
- 18

- 1,626
- 1
- 14
- 21
You can use Java 8 collectors and TreeSet
list.stream().collect(Collectors.toCollection(TreeSet::new))

- 2,050
- 1
- 23
- 27
-
`new TreeSet<>(hashSet)` is more concise and probably more efficient. – devconsole Mar 12 '20 at 19:19
Elements in HashSet can't be sorted. Whenever you put elements into HashSet, it can mess up the ordering of the whole set. It is deliberately designed like that for performance. When you don't care about the order, HashSet will be the most efficient set for frequent insertions and queries.
TreeSet is the alternative that you can use. When you iterate on the tree set, you will get sorted elements automatically. But it will adjust the tree to try to remain sorted every time you insert an element.
Perhaps, what you are trying to do is to sort just once. In that case, TreeSet is not the most efficient option because it needs to determine the placing of newly added elements all the time. Use TreeSet only when you want to sort often.
If you only need to sort once, use ArrayList. Create a new list and add all the elements then sort it once. If you want to retain only unique elements (remove all duplicates), then put the list into a LinkedHashSet, it will retain the order you have already sorted.
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
Now, you've gotten a sorted set if you want it in a list form then convert it into list.

- 3,797
- 3
- 37
- 49
-
Your statement "TreeSet will sort all the elements automatically every time you insert an element" is untrue. If you change the value used for comparing of an object in the list, and then add a new object it will be placed as if the object you changed has its original value. Thus only the new item gets placed in the list at the correct point assuming none of the elements changed their value used to sort the list. – Jaco-Ben Vosloo Aug 03 '21 at 14:27
-
@Jaco-BenVosloo Thanks. I've edited the answer to reflect your comment. – off99555 Aug 03 '21 at 17:39
Based on the answer given by @LazerBanana i will put my own example of a Set sorted by the Id of the Object:
Set<Clazz> yourSet = [...];
yourSet.stream().sorted(new Comparator<Clazz>() {
@Override
public int compare(Clazz o1, Clazz o2) {
return o1.getId().compareTo(o2.getId());
}
}).collect(Collectors.toList()); // Returns the sorted List (using toSet() wont work)

- 91
- 1
- 5
You can use TreeSet as mentioned in other answers.
Here's a little more elaboration on how to use it:
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);
Output:
[a1, a2, a3, a4, a5]
a1
a2
b1
b2
b3

- 2,892
- 3
- 31
- 44
In my humble opinion , LazerBanana's answer should be the top rated answer & accepted because all the other answers pointing to java.util.TreeSet
( or first convert to list then call Collections.sort(...)
on the converted list ) didn't bothered to ask OP as what kind of objects your HashSet
has i.e. if those elements have a predefined natural ordering or not & that is not optional question but a mandatory question.
You just can't go in & start putting your HashSet
elements into a TreeSet
if element type doesn't already implement Comparable
interface or if you are not explicitly passing Comparator
to TreeSet
constructor.
From TreeSet
JavaDoc ,
Constructs a new, empty tree set, sorted according to the natural ordering of its elements. All elements inserted into the set must implement the Comparable interface. Furthermore, all such elements must be mutually comparable: e1.compareTo(e2) must not throw a ClassCastException for any elements e1 and e2 in the set. If the user attempts to add an element to the set that violates this constraint (for example, the user attempts to add a string element to a set whose elements are integers), the add call will throw a ClassCastException.
That is why only all Java8 stream based answers - where you define your comparator on the spot - only make sense because implementing comparable in POJO becomes optional. Programmer defines comparator as and when needed. Trying to collect into TreeSet
without asking this fundamental question is also incorrect ( Ninja's answer). Assuming object types to be String
or Integer
is also incorrect.
Having said that, other concerns like ,
- Sorting Performance
- Memory Foot Print ( retaining original set and creating new sorted sets each time sorting is done or wish to sort the set in - place etc etc )
should be the other relevant points too. Just pointing to API shouldn't be only intention.
Since Original set already contains only unique elements & that constraint is also maintained by sorted set so original set needs to be cleared from memory since data is duplicated.

- 9,826
- 7
- 45
- 98
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);
}
}
}
input - ved prakash sharma apple ved banana
Output - apple banana prakash sharma ved

- 1,620
- 5
- 26
- 37
If you want want the end Collection
to be in the form of Set
and if you want to define your own natural order
rather than that of TreeSet
then -
- Convert the
HashSet
intoList
- Custom sort the
List
usingComparator
- Convert back the
List
intoLinkedHashSet
to maintain order - Display the
LinkedHashSet
Sample program -
package demo31;
import java.util.*;
public class App26 {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
addElements(set);
List<String> list = new LinkedList<>();
list = convertToList(set);
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int flag = s2.length() - s1.length();
if(flag != 0) {
return flag;
} else {
return -s1.compareTo(s2);
}
}
});
Set<String> set2 = new LinkedHashSet<>();
set2 = convertToSet(list);
displayElements(set2);
}
public static void addElements(Set<String> set) {
set.add("Hippopotamus");
set.add("Rhinocerous");
set.add("Zebra");
set.add("Tiger");
set.add("Giraffe");
set.add("Cheetah");
set.add("Wolf");
set.add("Fox");
set.add("Dog");
set.add("Cat");
}
public static List<String> convertToList(Set<String> set) {
List<String> list = new LinkedList<>();
for(String element: set) {
list.add(element);
}
return list;
}
public static Set<String> convertToSet(List<String> list) {
Set<String> set = new LinkedHashSet<>();
for(String element: list) {
set.add(element);
}
return set;
}
public static void displayElements(Set<String> set) {
System.out.println(set);
}
}
Output -
[Hippopotamus, Rhinocerous, Giraffe, Cheetah, Zebra, Tiger, Wolf, Fox, Dog, Cat]
Here the collection has been sorted as -
First - Descending order of String
length
Second - Descending order of String
alphabetical hierarchy

- 1
- 1

- 1,134
- 1
- 11
- 27
you can do this in the following ways:
Method 1:
- Create a list and store all the hashset values into it
- sort the list using Collections.sort()
- Store the list back into LinkedHashSet as it preserves the insertion order
Method 2:
- Create a treeSet and store all the values into it.
Method 2 is more preferable because the other method consumes lot of time to transfer data back and forth between hashset and list.

- 101
- 1
- 3
You can use guava library for the same
Set<String> sortedSet = FluentIterable.from(myHashSet).toSortedSet(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
// descending order of relevance
//required code
}
});

- 12,010
- 6
- 65
- 78

- 463
- 1
- 5
- 20
We can not decide that the elements of a HashSet would be sorted automatically. But we can sort them by converting into TreeSet or any List like ArrayList or LinkedList etc.
// 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");

- 115
- 1
- 7
SortedSet has been added Since java 7 https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html

- 731
- 2
- 7
- 18
You can wrap it in a TreeSet like this:
Set mySet = new HashSet();
mySet.add(4);
mySet.add(5);
mySet.add(3);
mySet.add(1);
System.out.println("mySet items "+ mySet);
TreeSet treeSet = new TreeSet(mySet);
System.out.println("treeSet items "+ treeSet);
output :
mySet items [1, 3, 4, 5]
treeSet items [1, 3, 4, 5]
Set mySet = new HashSet();
mySet.add("five");
mySet.add("elf");
mySet.add("four");
mySet.add("six");
mySet.add("two");
System.out.println("mySet items "+ mySet);
TreeSet treeSet = new TreeSet(mySet);
System.out.println("treeSet items "+ treeSet);
output:
mySet items [six, four, five, two, elf]
treeSet items [elf, five, four, six, two]
requirement for this method is that the objects of the set/list should be comparable (implement the Comparable interface)

- 1,630
- 21
- 24
The below is my sample code and its already answered by pointing the code in comments , am still sharing because it contains the complete code
package Collections;
import java.util.*;
public class TestSet {
public static void main(String[] args) {
Set<String> objset = new HashSet<>();
objset.add("test");
objset.add("abc");
objset.add("abc");
objset.add("mas");
objset.add("vas");
Iterator itset = objset.iterator();
while(itset.hasNext())
{
System.out.println(itset.next());
}
TreeSet<String> treeobj = new TreeSet(objset);
System.out.println(treeobj);
}
}
TreeSet treeobj = new TreeSet(objset); here we are invoking the treeset constructor which will call the addAll method to add the objects .
See this below code from the TreeSet class how its mentioned ,
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}

- 45
- 8
Convert HashSet
to List
then sort it using Collection.sort()
List<String> list = new ArrayList<String>(hset);
Collections.sort(List)

- 1,478
- 5
- 17
- 31
This simple command did the trick for me:
myHashSet.toList.sorted
I used this within a print statement, so if you need to actually persist the ordering, you may need to use TreeSets or other structures proposed on this thread.

- 4,816
- 6
- 31
- 51
-
1
-
1That looks like Scala to me, which unfortunately doesn't solve the problem in Java. – Roberto Mar 29 '16 at 18:31
-