在If和Else中定义变量,java

时间:2016-11-30 03:33:26

标签: java

我遇到了以下代码部分的问题,并且已经将其缩小了很多,但需要专家的眼睛来解释它为什么会破坏它。

下面的代码是图论问题的一部分,节点(宇航员)用边(配对)给出,ad得到的图有多个未连接的子图。我正在解决的问题不需要将未连接的节点创建为对象。

我通过迭代输入中提供的每个名称(int)配对来创建单个节点。然后将这些节点对象提供给Edge对象的构造函数。 为了确保我不创建相同节点的副本,我创建了一个列表来检查节点的名称(int)是否尚未给出。 如果尚未给出节点名称,则创建一个新节点作为变量A或B. 如果已经给出了名称HAS,则循环查找并将现有节点对象分配给占位符变量A或B.

我在下面的代码中得到编译时错误(在Hackerrank.com编辑器中工作)的第3行到最后一行:

“错误:找不到符号  配对P =新配对(A,B);                                     ^  符号:变量A“ (对于变量A和B,此错误同样发生,此处仅显示一条错误消息) 我知道if(){} else {}部分声明/选择变量A& B引入了此错误,但我的代码需要if / else检查。

有人可以解释为什么下面的代码会抛出此错误,或建议其他方法来解决问题吗?非常感谢!

public static void main(String[] args) throws Exception {
    //...
    ArrayList<Pairing> allPairings = new ArrayList<>(0);
    ArrayList<Astronaut> allAstronauts = new ArrayList<>(0);
    ArrayList<Integer> givenInts = new ArrayList<>(0);

    for (int i = 0; i < I; i++) {
        temp = bfr.readLine().split(" ");
        int a = Integer.parseInt(temp[0]);
        int b = Integer.parseInt(temp[1]);

        // Check values against list to see if they have been given before
        if (!(givenInts.contains(a))) {
            Astronaut A = new Astronaut(a);
            allAstronauts.add(A);
        } else {
            // Check all current astronauts for same name
            for (int t = 0; t < allAstronauts.size(); t++) {
                if (allAstronauts.get(t).getName() == a) {
                    Astronaut A = allAstronauts.get(t);
                }
            }
        }

        if (!(givenInts.contains(b))) {
            Astronaut B = new Astronaut(b);
            allAstronauts.add(B);
        } else {
            // Check all current astronauts for same name
            for (int r = 0; r < allAstronauts.size(); r++) {
                if (allAstronauts.get(r).getName() == b) {
                    Astronaut B = allAstronauts.get(r);
                }
            }
        }

        givenInts.add(a);
        givenInts.add(b);

        Pairing P = new Pairing(A,B);
        allPairings.add(P);
    }

1 个答案:

答案 0 :(得分:0)

AB的范围仅限于创建它们的块。因此,当您到达第二个最后一行时,它们都超出了范围({{1} })。因此,它们无法在那里使用。

这有点难以辨别,但我想您要在Pairing P = new Pairing(A,B);循环顶部附近声明AB并删除任何进一步的声明。

示例代码(省略了一些不相关的位)

for

您可能会收到有关for (int i = 0; i < I; i++) { Astronaut A, B; if (!(givenInts.contains(a))) { A = new Astronaut(a); allAstronauts.add(A); } else { //check all current astronauts for same name for (int t = 0; t < allAstronauts.size(); t++) { if (allAstronauts.get(t).getName().equals(a)) { A = allAstronauts.get(t); } } } if (!(givenInts.contains(b))) { B = new Astronaut(b); allAstronauts.add(B); } else { //check all current astronauts for same name for (int r = 0; r < allAstronauts.size(); r++) { if (allAstronauts.get(r).getName().equals(b)) { B = allAstronauts.get(r); } } } Pairing P = new Pairing(A,B); A未分配的警告。如果是这样,可以将它们设置为B,如果它们都是非空的,则只创建null

注意:我还将您的字符串比较从Pairing更改为== b