2012-02-23 57 views
2

我敢肯定,我正在用Java(這實際上是我的第一個程序)犯了一個新手的錯誤。我試圖將我編寫成java的一些工作python代碼(作爲學習/測試練習來學習一些差異),但是我在兩者之間得到了不同的結果。試圖將python代碼移植到Java,但得到不同的結果

我的程序需要一個數據列表並基於它生成另一個列表(基本上看看一個值是否可以被一個和分解)。 Python正確地給出了2,578個結果,而Java只給出了12個。我試圖在java中找到相同的命令,並認爲我做了,但似乎無法弄清楚爲什麼結果不同(兩者之間的區別我遇到了多線程問題和同步變量,並不確定Java是否在幕後做任何事情,所以我有一個while循環繼續運行,直到結果穩定,但它沒有幫助。任何的意見都將會有幫助。

下面是有問題的代碼(java的在底部註釋作爲參考的頂部,Python和僞代碼):

     for (int c = 0; c <= max_value; c++){ 
          String temp_result = (s - c * data.get(i) + "," + i); 

          if(results.contains(temp_result)){ 
           String result_to_add = (s + "," + i+1); 
           if(results.contains(result_to_add)){ 
            System.out.println("contains result already"); 
           } else { 
            results.add(result_to_add); 

           } print len(T) 

#Here's the basic pseudo code(I added a few control variables but here's a high level view): 

for i = 1 to k 
    for z = 0 to sum: 
     for c = 1 to z/x_i: 
      if T[z - c * x_i][i - 1] is true: 
       set T[z][i] to true 
*/ 
+1

當您在代碼中發現錯誤並且出現意想不到的情況時,調試器可能非常有用。它通常是您在IDE中運行的按鈕。 ;) – 2012-02-23 13:01:59

+0

@PeterLawrey謝謝你,我使用eclipse並且看過那個按鈕,但從來沒有真正點擊過它,因爲在python中,一堆打印語句和sys.exit()往往足夠了。我想我需要一個新的Java調試方法,所以我想我必須學習那個按鈕的功能。 – Lostsoul 2012-02-23 13:12:06

+0

在感興趣的行上添加一個斷點,它會顯示所有局部變量。您可以評估表達式,以便您可以看到代碼不同時會得到的結果。這可以讓你嘗試修復。 – 2012-02-23 13:14:38

回答

4

在java中s + "," + i+1是一個字符串連接: 「10」 + 「」 + 4 + 1將返回10,41。

改爲使用String result_to_add = s + "," + (i+1);

+0

外部括號是多餘的。 – 2012-02-23 13:09:59

+0

非常感謝!有效!沒有意識到正在發生。老實說,我花了2個小時尋找其他地方(我甚至可能在幕後cpu multiprocessing導致變量不同步)。非常感謝! – Lostsoul 2012-02-23 13:10:40

+0

@Stephen C:編輯:) – TacticalCoder 2012-02-23 13:14:45

1

我看你已經解決了這個問題剛纔,但因爲我已經寫了,這裏是我的版本:

它使用使用點作爲替代2個元素的Python列表的伎倆/元組int,它(巧合地)繞過了你的字符串連接問題。

public class Sums 
{ 
    public static void main(String[] args) 
    { 
     List T = new ArrayList(); 
     T.add(new Point(0, 0)); 
     int target_sum = 100; 
     int[] data = new int[] { 10, -2, 5, 50, 20, 25, 40 }; 
     float max_percent = 1; 
     int R = (int) (target_sum * max_percent * data.length); 
     for (int i = 0; i < data.length; i++) 
     { 
      for (int s = -R; s < R + 1; s++) 
      { 
       int max_value = (int) Math.abs((target_sum * max_percent) 
         /data[i]); 
       for (int c = 0; c < max_value + 1; c++) 
       { 
        if (T.contains(new Point(s - c * data[i], i))) 
        { 
         Point p = new Point(s, i + 1); 
         if (!T.contains(p)) 
         { 
          T.add(p); 
         } 
        } 
       } 
      } 
     } 
     System.out.println(T.size()); 
    } 
} 
+0

非常感謝!它看起來比我的更乾淨,類似的流程讓我覺得我的第一個Java程序沒有我想象的那麼糟糕。再次感謝,我會確定。查看點命令的功能。 – Lostsoul 2012-02-23 13:46:14

+1

'java.awt.Point'是實際用於存儲'x,y'座標對的類,但它作爲'int'的2元素列表非常適用。一個黑客的位,但可能沒有比使用字符串差;-) – DNA 2012-02-23 14:17:42

+0

很高興知道。非常感謝你的幫助。你搖滾! – Lostsoul 2012-02-23 17:31:15