2016-06-08 97 views
0

我有一个2D阵列
int[][] lists=new int[][]{{22, 23},{34, 35},{47, 15}};如何获取2D数组中每个元素的所有可能组合?

我得各个元件的所有组合在每行中,像这样: int [][] result= {{22,34,47},{22,34,15},{22,35,47},{22,35,15},{23,34,47},{23,34,15},{23,35,47},{23,35,15}}

然后,对于从最新的阵列,每个行我必须计算平均。为此,我创建了一个方法average(int[]a)。 我只需要获得平均值最高的组合。 因为我的初始数组可以有大量的行/列,我试图生成每个组合,并检查它的平均值是否高于然后记忆它。 这是我的代码,但显然它不起作用。有人能帮我吗?

public static int average(int[]a) 
{ 
    int sum=0; 
    for(int i=0;i<a.length;i++)sum+=a[i]; 
    return sum/a.length; 
} 
public static void cartesian(int[][] lists, int[] values, int n) 
{ 
    int sum=0; 
    List<List<Integer>> result = new ArrayList<List<Integer>>(); 
    if (n == lists.length) { 
    if(average(values)>sum) { 
     result.clear(); 
     result.add(Arrays.stream(values).boxed().collect(java.util.stream.Collectors.toList())); 
     sum=average(values);} 
    } 
    else 
    { 
     for(int i: lists[n]) { 
     values[n] = i; 
     cartesian(lists, values, n+1); 
    } 
    } 
return result; 
} 
public static void main(String[] args) 
    { 
     List<List<Integer>> result = cartesian(lists, new int[lists.length], 0); 
     for(List<Integer> i: result) System.out.println(i); 
    } 
+0

我相当肯定,[Commons Math](http://commons.apache.org/proper/commons-math/)有一个组合函数,可能是对此有用。不知道它是否做了阵列,也许只有nCr类型。 –

回答

-1

我想你的cartesian代码中有几个逻辑错误。从我可以说,这是决定哪个阵列具有最高平均值的函数。首先,在声明中

int sum=0; 
    List<List<Integer>> result = new ArrayList<List<Integer>>(); 
    if (n == lists.length) { 
    if(average(values)>sum) { 

的最后一行是无关紧要的 - 你定义sum所以,如果你的价值观是不是消极的if语句将永远是正确的。此外,在后面的代码,

else 
    { 
     for(int i: lists[n]) { 
     values[n] = i; 
     cartesian(lists, values, n+1); 
    } 

我想你的意思是把cartesian(lists, values, n+1)以外的for循环。这里是我将如何重写此代码:

public static void cartesian(int[][] lists, int[] values, int n) 
{ 
    int sum=0; 
    List<List<Integer>> result = new ArrayList<List<Integer>>(); 
    int[] totest = lists[n]; 
    if(average(totest) > average(values) || r.equals(null)) { 
     result.clear(); 
     result.add(Arrays.stream(totest).boxed().collect(java.util.stream.Collectors.toList())); 
     if(n != lists.length - 1){cartesian(lists, totest, n + 1)}; 
} 
    else 
    { 
     if(n != lists.length - 1){cartesian(lists, totest, n + 1)}; 
    } 
return result; 
} 
+0

我试过你的鳕鱼,我得到一个错误java.lang.ArrayIndexOutOfBoundsException'int [] totest = lists [n];' – gimmi

+1

刚刚编辑它,它应该是'lists.length - 1' :) – sahilkmr78

+0

对不起,问题也是我没有添加if语句来递归调用'else'部分的函数。 – sahilkmr78

相关问题