2016-11-30 180 views
0

我在下面的代码段中遇到了问题,并且已经将它缩小了很多,但需要专家的注意才能解释它为什么会中断。在If和Else中定义变量,java

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

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

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

“错误:无法找到符号 配对P =新的配对(A,B ); ^ 符号:变量A“ (对于两个变量A & B此错误发生相同,此处仅显示一条错误消息) 我知道声明/选择变量A & B的if(){} else {}部分引入了此错误,但是我的代码需要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); 
    } 
+0

您需要首先声明,它在您需要的范围内。 – SLaks

+0

你为什么重新定义变量? – Li357

+0

感谢您的回答,我可以通过在不同部分定义变量来解决问题,但我不确定我是否明白为什么会出现问题。 代码工作完美的很好地循环回来相同的“宇航员A =新宇航员(输入);多次,只有当它被包含在if/else语句中时失败: -/ –

回答

0

两个AB的范围仅限于他们所创建的块。因此,他们都出来的时候范围您到达倒数第二行(Pairing P = new Pairing(A,B);)。因此它们不可用于那里。

这有点难以分辨,但我认为您想要在for循环的顶部附近声明AB并删除所有进一步的声明。

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

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); 

您可能会得到一个警告约AB未赋值。如果是这样,也许将它们设置为null,并且只有在它们都为非空时才创建Pairing

注:我也将您的字符串比较从== b更改为.equals(b)