2

编辑:这实际上是针对 Android 应用程序的,这意味着(据我所知),我只能使用 HashSet。

Set<String> set = new HashSet<String>();

set.add("1");
set.add("2");
set.add("3");
set.add("4");
set.add("5");
set.add("6");
set.add("7");
set.add("8");

String[] array = set.toArray(new String[0]); // convert the set to an array

System.out.println(Arrays.toString(array)); // test what the set looks like

的输出是[3, 2, 1, 7, 6, 5, 4, 8]

我期待[1, 2, 3, 4, 5, 6, 7, 8],因为我认为它会按照我添加字符串的顺序将字符串添加到集合中。

在我的应用程序中,Set 的顺序必须与元素添加到 Set 中的顺序一致。

这个 Set 有什么问题吗?或者有没有办法把它放回添加元素的顺序?

4

6 回答 6

7

喂。

  1. HashSet - 不维护插入顺序。
  2. LinkedHashSet - 维护插入顺序。
  3. TreeSet - 保持数据自然顺序,或者您可以定义自定义顺序并通过比较器。

你可以选择第二种。

Set<String> set = new LinkedHashSet<String>();
于 2013-12-23T08:33:15.500 回答
6

LinkedHashSet如果要对集合的元素进行排序,请使用 a 。有关更多详细信息,请参阅链接。

于 2013-12-23T08:26:24.727 回答
2

数据结构HashSet是无序和无序的集合。如果你希望你的元素使用自然顺序排序,你可以使用TreeSet 如果你想保持使用插入顺序,使用LinkedHashSet

于 2013-12-23T08:27:54.153 回答
2

不,这是设计使然。AHashSet将以最小化检索速度的方式将您的字符串插入适合您的数据的存储桶中。

如果要保留字典顺序,请使用TreeSet. (对于您给出的示例,这起作用,但只是因为您的输入数据已排序)。

如果要保留插入顺序,请使用LinkedHashSet.

于 2013-12-23T08:28:06.347 回答
1

是的,这是有原因的,如果您阅读了它的 javadoc 的第一行,您就会知道:

该类实现了由哈希表(实际上是 HashMap 实例)支持的 Set 接口。它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。

于 2013-12-23T08:27:40.780 回答
1

HashSet不保持可预测的顺序,它将取决于对象hashCode引用的。如果您想保持插入元素的顺序,请使用LinkedHashSet. 如果要保持元素始终排序,请使用TreeSet.

于 2013-12-23T08:29:23.557 回答