我确定我在使用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
*/
答案 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());
}
}