使用以下代码,我期待四个元素,但只获得三个元素。显然,我正在做一些疯狂的事情。
import java.util.HashSet;
import java.util.Set;
public class MyTest {
public static void main(String[] args) {
String[] myStrings = new String[] { "a", "b" };
Set<String> set = new HashSet<String>();
for (String x : myStrings) {
for (String y : myStrings) {
String temp = x;
x = y;
y = temp;
set.add(x + y);
}
}
System.out.println(set);
}
}
结果:
[ba, aa, ab]
答案 0 :(得分:4)
设置不允许重复,并且您要添加“ba”两次。你的循环控制如果令人困惑,但这里是简化的跟踪,扩展了rvalues。
x = "a"
y = "a"
temp = "a"
x = "a"
y = "a"
add("aa")
y = "b"
temp = "a"
x = "b"
y = "a"
add("ba")
x = "b"
y = "a"
temp = "b"
x = "a"
y = "b"
add("ab")
y = "b"
temp = "a"
x = "b"
y = "a"
add("ba")
答案 1 :(得分:1)
每次运行内部循环时,都在修改外部循环的变量。因此x
可能会损坏。
特别是身体的倒数第二次执行将'a'
分配给x
。下一次围绕循环,我们错过了"bb"
,而是获得了重复"ab"
。
使用final
非常方便。
答案 2 :(得分:1)
使用循环变量是个问题。
这样做:
Set<String> set = new HashSet<String>();
for (String x : myStrings) {
for (String y : myStrings) {
String temp = x;
x = y;
y = temp;
System.out.println(x+y);
set.add(x + y);
}
}
您将看到您正在添加两次ab,这在Set中意味着覆盖。然后更改循环以使用除循环变量之外的其他内容,例如:
Set<String> set = new HashSet<String>();
for (String a : myStrings) {
for (String b : myStrings) {
String x = a;
String y = b;
String temp = x;
x = y;
y = temp;
System.out.println(x+y);
set.add(x + y);
}
}
你将得到你想要的所有4件事。我必须更多地阅读有关如何以完成工作方式遍历数组的内容,但这显然是罪魁祸首。
答案 3 :(得分:1)
您正在更改外部循环变量,因此输出意外地缺少“bb”。
答案 4 :(得分:0)
for (String x : myStrings) {
for (String y : myStrings) {
String temp = x;
x = y;
y = temp;
set.add(x + y);
}
}
当它们都是循环变量时,为什么要将内容分配给x
和y
?如果您希望独立遍历x
和y
,请删除这3行以交换x和y。您正在以可能与预期不同的方式修改变量。
答案 5 :(得分:-1)
也许是因为你将结果字符串放入哈希集中,这不会保留顺序。尝试使用链接的哈希集。
答案 6 :(得分:-1)
问题很简单 - 输出中的“bb”在哪里。它应该生成4个字符串。