【问题标题】:Order of printing elements of hashset [duplicate]hashset的打印元素顺序[重复]
【发布时间】:2021-07-16 15:08:17
【问题描述】:

在准备Java考试的过程中,我遇到了这个问题:

public static Function<String, String> change = i -> {
        if (i.equals("Au"))
            return "Ne";
        else
            return i;
    };

Set<String> someStrings = Set.of("Au", "Ja", "Ta", "Cy", "Cu");
        someStrings = someStrings
                .stream()
                .map(change)
                .map(n -> n.substring(0, 1))
                .collect(Collectors.toSet());
        for (String s : someStrings) {
            System.out.print(s);
        }

这个问题的答案表明打印顺序很重要。但是在这种情况下应该如何确定打印顺序呢? 我唯一的猜测是在 Set.of() 方法中列出元素的顺序相反。

【问题讨论】:

  • a HashSet 的元素没有确定的顺序
  • @Lino:这是真的,但并不是说没有一个HashSet (公开地)参与此代码。但是关于Set 接口itselt,同样的说法仍然成立:Set 没有提供定义的排序。
  • Collectors.toSet() 的文档说不保证返回的 Set 的类型、可变性、可序列化性或线程安全性。只有TreeSet 可以定义其元素的顺序。由于我们不知道它是否是 TreeSet,因此无法保证元素是有序的。
  • @MisaD.: TreeSet 没有排序,它是排序的:它不保持插入顺序,它保持“自然顺序”。 LinkedHashSet 维护插入顺序。
  • 好像和this question一样的考试,我们才三天前。或许,这场可怕的考试引发了更多的问题。

标签: java collections set


【解决方案1】:

Set in general 没有为其迭代器提供定义的顺序:

元素按不特定顺序返回 [...]。

Set.of 被明确指定返回an unordered Set

  • 集合元素的迭代顺序未指定,可能会发生变化。

Collectors.toSet被定义为构造一个未指定的Set,这意味着Set的一般规则适用(见上文)。

文档中没有任何内容在这里定义任何种可靠顺序。实现最终返回此处的任何顺序都是有效的。

【讨论】:

    猜你喜欢
    • 2015-06-22
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 2022-07-05
    相关资源
    最近更新 更多