如何对HashSet进行排序?

Dia*_*ana 92 java sorting collections set hashset

对于列表,我们使用该Collections.sort(List)方法.如果我们想要排序HashSet怎么办?

isa*_*ert 104

HashSet不保证其元素的任何顺序.如果您需要此保证,请考虑使用TreeSet来保存元素.

但是,如果您只需要为这一次出现排序的元素,那么只需临时创建一个List并对其进行排序:

Set<?> yourHashSet = new HashSet<>();

...

List<?> sortedList = new ArrayList<>(yourHashSet);
Collections.sort(sortedList);
Run Code Online (Sandbox Code Playgroud)


Abd*_*han 58

将所有对象添加到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]
Run Code Online (Sandbox Code Playgroud)

  • 通过使用`TreeSet myTreeSet = new TreeSet(myHashSet);`,您可以避免再次将所有元素添加到Treeset。 (6认同)

P45*_*ent 14

使用java.util.TreeSet作为实际的对象.迭代此集合时,值将以明确定义的顺序返回.

如果你使用java.util.HashSet那么顺序取决于内部有功能,很可能不是词法.

  • 这是非常错误的.它不以lexographic(sp?)顺序存储键.它要么使用它们的自然顺序(它取决于键实现的`Comparable`接口),要么使用提供的`Comparator`. (3认同)

Laz*_*ana 13

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
Run Code Online (Sandbox Code Playgroud)

*Foo::getSize这是一个如何按大小自然地对YourItem的HashSet进行排序的示例.

*Collectors.toList()将收集排序到List中的结果,您将需要捕获它List<Foo> sortedListOfFoo =


小智 12

您可以使用TreeSet.

  • 仅放置元素不会提供对其中包含任何元素的任何顺序进行排序的灵活性。上面的解决方案确实如此。 (3认同)

Ank*_*rma 10

以防万一你不想使用a,TreeSet你可以尝试使用java流来获得简洁的代码。

set = set.stream().sorted().collect(Collectors.toCollection(LinkedHashSet::new));
Run Code Online (Sandbox Code Playgroud)


off*_*555 5

HashSet 中的元素无法排序。每当您将元素放入 HashSet 时,它都会弄乱整个集合的顺序。它是为了性能而故意设计的。当你不关心顺序时,HashSet 将是最有效的频繁插入和查询的集合。

TreeSet 是您可以使用的替代方法。当您对树集进行迭代时,您将自动获得已排序的元素。但是每次插入元素时,它都会调整树以尝试保持排序。

也许,您要做的只是排序一次。在这种情况下,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
Run Code Online (Sandbox Code Playgroud)

现在,如果您希望以列表形式将其转换为列表,则您已经获得了一个排序集。


Nin*_*nja 5

您可以使用Java 8收集器和TreeSet

list.stream().collect(Collectors.toCollection(TreeSet::new))


Lea*_*o S 5

根据@LazerBanana 给出的答案,我将按对象的 Id 排序我自己的 Set 示例:

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)
Run Code Online (Sandbox Code Playgroud)