2016-11-30 174 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)