Set <string>的维护顺序与</string>中添加元素的顺序不一致

时间:2013-12-23 08:25:29

标签: java set setstring

编辑:这实际上是针对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的顺序。

这套装是否有故障?或者有没有办法将其重新添加到添加元素的顺序中?

6 个答案:

答案 0 :(得分:5)

如果要订购集合的元素,请使用LinkedHashSet。有关详细信息,请参阅this链接。

答案 1 :(得分:3)

HLO。

  1. HashSet - 不维护广告订单。
  2. LinkedHashSet - 维护广告订单。
  3. TreeSet - 以自然顺序保存数据,或者您可以定义自定义顺序并传递比较器。
  4. 你可以选择第二种选择。

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

答案 2 :(得分:2)

数据结构HashSet是无序和未排序的集合。 如果您希望使用自然顺序对元素进行排序,可以使用TreeSet 如果您想使用广告订单维护,请使用LinkedHashSet

答案 3 :(得分:2)

不,这是设计上的。 HashSet会将您的字符串插入适合您数据的存储区中,从而最大限度地降低检索速度。

如果您想保留词法顺序,请使用TreeSet。 (使用示例,您可以 工作,但仅因为您的输入数据已排序)。

如果您想保留广告订单,请使用LinkedHashSet

答案 4 :(得分:1)

是的,有一个原因,你会知道你是否读过它的第一行是javadoc:

  

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

答案 5 :(得分:1)

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