2012-02-23 46 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