交换变量时每个行为都有奇怪的java

时间:2010-12-15 02:29:13

标签: java

使用以下代码,我期待四个元素,但只获得三个元素。显然,我正在做一些疯狂的事情。

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]

7 个答案:

答案 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);
    }
}

当它们都是循环变量时,为什么要将内容分配给xy?如果您希望独立遍历xy,请删除这3行以交换x和y。您正在以可能与预期不同的方式修改变量。

答案 5 :(得分:-1)

也许是因为你将结果字符串放入哈希集中,这不会保留顺序。尝试使用链接的哈希集。

答案 6 :(得分:-1)

问题很简单 - 输出中的“bb”在哪里。它应该生成4个字符串。