如何sortingHashSet?
对于列表,我们使用Collections.sort(List)
方法。 如果我们想要对HashSet
进行sorting呢?
HashSet不保证其元素的任何顺序。 如果你需要这个保证,考虑使用TreeSet来保存你的元素。
但是,如果您只需要为这一个事件sorting的元素,那么只需临时创build一个List并对其进行sorting:
Set yourHashSet = new HashSet(); ... List sortedList = new ArrayList(yourHashSet); Collections.sort(sortedList);
将所有对象添加到TreeSet,您将得到一个有序的Set。 下面是一个原始的例子。
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]
使用java.util.TreeSet
作为实际的对象。 当你迭代这个集合时,这个值会以一个明确的顺序返回。
如果你使用java.util.HashSet
那么顺序依赖于一个内部函数,而不是可能不是词法。
您可以改为使用TreeSet 。
在其他答案中可以使用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
Java 8的sorting方式是:
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进行sorting。
* Collectors.toList()
将收集sorting结果到List中,您将需要使用List<Foo> sortedListOfFoo =
捕获它List<Foo> sortedListOfFoo =
HashSet中的元素无法sorting。 每当你把元素放到HashSet中,就会弄乱整个桶。 关于它的好处是性能的效率。
每次插入元素时,TreeSet都会自动对所有元素进行sorting。
也许,你要做的只是sorting一次。 在这种情况下,TreeSet不是最好的select,因为它需要一直确定添加新元素的位置。
最有效的解决scheme是使用ArrayList。 创build一个新的列表,并添加所有的元素,然后sorting一次。 如果你只想保留唯一的元素(删除所有的重复项,比如set,那么把这个列表放到一个LinkedHashSet中,它将保留你已经sorting的顺序)
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.
现在,你已经得到了一个有序集,如果你想以列表的forms,然后将其转换为列表。
你可以通过以下方式来做到这一点:
方法1:
- 创build一个列表并存储所有的哈希值
- 使用Collections.sort()对列表进行sorting
- 将列表存储回LinkedHashSet,因为它保留了插入顺序
方法2:
- 创build一个treeSet并将所有的值存储到它。
方法2是更优选的,因为其他方法在哈希集和列表之间消耗大量时间来传输数据。
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苹果ved香蕉
产量 – 苹果香蕉prakash sharma ved
你可以使用相同的番石榴库
Set<String> sortedSet = FluentIterable.from(myHashSet).toSortedSet(new Comparator<String>() { @Override public int compare(String s1, String s2) { // descending order of relevance //required code } });
我们不能决定HashSet的元素会自动sorting。 但是我们可以通过转换成TreeSet或ArrayList或LinkedList等任何列表来对它们进行sorting。
// 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");
这个简单的命令为我做了诡计:
myHashSet.toList.sorted
我在一个打印语句中使用了这个,所以如果你需要实际的持久化顺序,你可能需要使用TreeSets或其他在这个线程上提出的结构。