尝试将python代码移植到Java但获得不同的结果

时间:2012-02-23 12:46:59

标签: java python

我确定我在使用java时犯了一个新手错误(这实际上是我的第一个程序)。我正在尝试将一些工作的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
*/

2 个答案:

答案 0 :(得分:4)

在java s + "," + i+1中是一个字符串连接:“10”+“,”+ 4 + 1将返回10,41。

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

答案 1 :(得分:1)

我知道你刚刚解决了这个问题,但既然我已经写好了,这是我的版本:

这使用了使用Point作为int的2元素Python列表/元组的替代技巧,巧合地绕过了你的字符串连接问题。

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