我写了下面的代码,
public int longestConsecutive(int[] nums) {
Set<Integer> num_set = new HashSet<Integer>();
for (int num : nums) {
num_set.add(num);
System.out.println("num_set: " + num_set.toString());
}
Run Code Online (Sandbox Code Playgroud)
然后我有测试用例,
int[] nums = {100, 4, 200, 1, 3, 2};
Run Code Online (Sandbox Code Playgroud)
然后在最后一行输出中,控制台显示,
num_set: [1, 2, 3, 100, 4, 200]
Run Code Online (Sandbox Code Playgroud)
我想知道为什么之前的订单在添加操作后被更改了.
说明HashSet文档
它不能保证集合的迭代顺序; 特别是,它不保证订单会随着时间的推移保持不变.
如果您想使用Set仍然是自然顺序的,请使用SortedSet.
一个集合,进一步提供其元素的总排序.元素按照它们的自然顺序排序,或者通过通常在排序集创建时提供的比较器排序.
编辑:A Set确实没有说明其元素的顺序.例如,如果两个集合包含相同的元素并且具有相同的大小,则它们是等于的.a的迭代顺序Set取决于实现,并且可能在版本之间发生变化,因此您不应对其进行任何假设.它可能取决于值#hashCode,但也可能取决于插入顺序或将来的其他内容.但是,我们不应该在乎,因为如果你这样做,你应该使用一个List或一个SortedSet代替.
看起来您想保留插入顺序。有一个班级叫LinkedHashSet这个。以下是一些示例代码:
int[] nums = {100, 4, 200, 1, 3, 2};
Set<Integer> ints = new LinkedHashSet<>();
for(int i : nums) {
ints.add(i);
}
System.out.println(ints);
Run Code Online (Sandbox Code Playgroud)
上面的代码打印: [100, 4, 200, 1, 3, 2]
正如文档所说:
Set 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashSet 的不同之处在于它维护一个双向链表,贯穿其所有条目。这个链表定义了迭代顺序,也就是元素被插入到集合中的顺序(插入顺序)。请注意,如果将元素重新插入到集合中,则插入顺序不会受到影响。(如果 s.add(e) 在 s.contains(e) 将在调用之前立即返回 true 时调用,则元素 e 被重新插入到集合 s 中。)