2016-11-03 63 views
0

我正在努力修復Java中的循環,如果有人能夠幫助我,我會非常感激。JAVA LOOP:總和的數字集

整個代碼:http://pastebin.com/C5SQghFa

循環問題:

for(int i = 0 ; i < length ; i++){ 
     for(int j = 1 ; j < length ; j++){   
      if(defaultSet.get(i) + defaultSet.get(j) == sum){ 
       System.out.println("YUP\n" + defaultSet.get(i) + " " + defaultSet.get(j)); 
       finalSet.add(defaultSet.get(j)); 
      }else if(defaultSet.get(i) == sum && !finalSet.contains(defaultSet.get(i))){ 
       finalSet.add(defaultSet.get(i)); 
      }else{ 
       System.out.println("NOPE\n" + defaultSet.get(i) + " " + defaultSet.get(j)); 
      } 
     } 
    } 

我想通過一個ArrayList運行兩次,這樣我就可以比較,如果總和等於目標值用戶輸入。

簡單的第一條if語句將兩個值進行比較,如果有效,則添加該值。第二個陳述看到目標值是否在列表中,並且如果是,則會自動添加它。

如果第三條語句不等於TARGET VALUE,它將忽略輸出值。

我的問題是循環無法正常工作。對於某些輸入他們的正常,但例如:

的ArrayList:8,5,5,2

目標值:10

OUTPUT:5,5,5,5

這是不正確。輸出應該是:8,5,5,2!我的循環跳過了第一次和最後一次比較,並添加了我不想要的額外值。任何人都可以解釋如何正確設置這些循環?

回答

0

的問題是在該行:

int endLength = length--; 

,你應該排除表的比較,其中i和j是相同的。

你正在改變長度var的值。

你的實現有O(n^n)comlexity,有更高效的方法來實現這個函數。

+0

那是我用之前的測試值。我忘了刪除那一行。我沒有使用它,但有人指出我確實有我的j = 1,當它應該在j = 0時開始。所以,謝謝你是我的代碼中仍然存在的同一類型的問題! –

0

如果你真的想要那個輸出,你應該改變2行。

例如爲:

 for (int j = 0; j < length; j++) { 
      if (defaultSet.get(i) + defaultSet.get(j) == sum && j != i) { 

輸出(的finalSet含量):

8, 5, 5, 2 

注意:從0

  • j開始考慮所有的值
  • j應該比i不同=>否則你8, 5, 5, 5, 5, 2

這是您的具體的例子工作的例子。

如果你想有更精確的東西,你也應該提供規則

以下輸入8, 5, 5, 5, 210的預期輸出可能會有用。是8, 5, 5, 2還是8, 5, 5, 5, 5, 5, 5, 2還是別的?

8, 5, 2怎麼樣?是8, 5, 2還是8, 5, 5, 2還是別的?

根據您的規則上,你也可以有(它打印兩次的元素,則將其總和的一半):

boolean ok = true; 
    for (int a : defaultSet) { 
     for (int b : defaultSet) { 
      if (a + b == sum) { 
       if (a == b) { 
        if (ok) { 
         finalSet.add(a); 
         finalSet.add(b); 
         ok = false; 
        } 
       } else { 
        finalSet.add(a); 
       } 
      } else if (a == sum && !finalSet.contains(a)) { 
       finalSet.add(a); 
      } 
     } 
    } 
+0

非常感謝!我最近添加的是 !finalSet.contains 所以我有一種感覺,我需要類似的東西在第一個循環。這完全解決了我的問題! –