显然,套装没有任何排序,所以如果我做的话,我不能指望任何具体的排序
String[] string = mySet.toArray();
但是,我遇到了一个用例,我不关心字符串数组的排序,但我确实需要它是这样的情况:如果两个集合彼此相等,那么:
StringUtils.join(mySet.toArray(),',');
将始终为这些集合生成相同的字符串,无论我运行程序多少次,假设我坚持使用相同的代码。
我有这个保证吗?
同样,对于迭代器中给定Set的元素出现的顺序,这完全是真的吗?
答案 0 :(得分:7)
一般情况下,您无法保证Set
的顺序,所以即使它现在有效,也可能在将来不行。但是,您可以保证LinkedHashSet
的顺序,以便您可以使用它。这仅在集合具有以相同顺序插入的元素时才有效。如果您没有这种情况,您可能只需要对该集进行排序并打印出来。
答案 1 :(得分:4)
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
具有相同的效果。< / p>
答案 2 :(得分:4)
从技术上讲,没有你没有保证。 Set
是一个界面。实施方式会有所不同,可能会也可能不会遵守此要求。
通过从Set中提取结果后自行排序数组来强制解决问题。
答案 3 :(得分:3)
这完全取决于Set
实施。 Set
是一个接口,而不是一个类,toArray()
除了必须与实现的迭代器匹配外,不保证任何东西。
来自Set.toArray()的javadoc:
如果此set对其迭代器返回的元素的顺序有任何保证,则此方法必须以相同的顺序返回元素。
答案 4 :(得分:2)
您没有此保证。可能你总是会看到这项工作,因为我怀疑大多数Set.toArray()
的实现会为相同的集合生成相同的顺序,但是不能依赖于此。
你也不能依赖迭代器的顺序。
集完全无序。由于实现行为,您可能会从它们中获得看起来像一致顺序的内容,但这绝不是可依赖的。
答案 5 :(得分:1)
对于HashSet,您可以按相同顺序添加元素,并根据容量和负载因子获得不同的订单。
以下是一个示例,您可以从同一个集合中获得许多不同的订单。
http://vanillajava.blogspot.co.uk/2011/09/order-of-elements-in-hash-collection.html