【问题标题】:Is a set's "toArray" deterministic?集合的“toArray”是确定性的吗?
【发布时间】:2012-04-14 13:49:52
【问题描述】:

显然,集合没有任何排序,所以我不能指望任何特定的排序

String[] string = mySet.toArray();

但是,我遇到了一个用例,我不关心字符串数组的顺序,但我确实需要这样的情况,即如果两个集合彼此相等,那么:

StringUtils.join(mySet.toArray(),',');

假设我坚持使用相同的代码,无论我运行程序多少次,都会为这些集合生成完全相同的字符串。

我有这个保证吗?

同样,对于给定 Set 中元素在迭代器中出现的顺序,这是否完全正确?

【问题讨论】:

  • 旁白:“Java”不是首字母缩写词。
  • 套装可以订购。例如树集。
  • @kukudas 我真的认为“不订购”是一套事实上的要求之一。谢谢!

标签: java collections set


【解决方案1】:

一般而言,您无法保证Set 的顺序,因此即使它现在有效,将来也可能无效。但是,您可以保证LinkedHashSet 的顺序,因此您可以使用它。这仅在集合以相同顺序插入元素时才有效。如果您没有这种情况,您可能只需要对集合进行排序并打印即可。

【讨论】:

    【解决方案2】:

    从技术上讲,不,您没有保证。 Set 是一个接口。实现会有所不同,可能会或可能不会遵守此要求。

    在从 Set 中提取结果后,通过自己对数组进行排序来强制解决问题。

    【讨论】:

    • 谢谢。这里所有的好答案(都赞成)但是这个给出了一个明确的解决方案。我会“强制解决问题”。
    【解决方案3】:

    不,绝对不是。举个简单的例子,考虑:

     LinkedHashSet<String> set1 = new LinkedHashSet<String>();
     set1.add("x");
     set1.add("y");
    
     LinkedHashSet<String> set2 = new LinkedHashSet<String>();
     set2.add("y");
     set2.add("x");
    

    这两个集合是相等的,但是因为 LinkedHashSet 保留了插入顺序,所以可以保证它们的迭代器将以不同的顺序返回值 - 我希望 toArray 具有相同的效果。

    【讨论】:

      【解决方案4】:

      这完全取决于Set 的实现。 Set 是一个接口,而不是一个类,并且toArray() 不保证任何东西,除非它必须匹配实现的迭代器。

      来自 Set.toArray() 的 javadoc:

      如果这个集合保证了它的元素被它的迭代器返回的顺序,这个方法必须以相同的顺序返回元素。

      【讨论】:

        【解决方案5】:

        您没有此保证。您可能总是会看到这项工作,因为我怀疑Set.toArray() 的大多数实现都会为相等的集合产生相同的顺序,但您不能依赖于此。

        你也不能依赖迭代器的顺序。

        集合是完全无序的。由于实现行为,您可能会从中得到一些看起来像一致顺序的东西,但这绝不是值得依赖的。

        【讨论】:

          【解决方案6】:

          对于 HashSet,您可以按相同的顺序添加元素,并根据容量和负载因子获得不同的顺序。

          这是一个示例,您可以从同一个集合中获得许多不同的订单。

          http://vanillajava.blogspot.co.uk/2011/09/order-of-elements-in-hash-collection.html

          【讨论】:

            猜你喜欢
            • 2019-01-26
            • 1970-01-01
            • 2019-09-09
            • 2011-12-31
            • 2012-05-13
            • 2016-10-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多