子阵列的组合

时间:2018-04-19 02:55:50

标签: java

不确定是否已经问过这个问题,但我在打印子阵列组合时遇到问题。

说出来

int[][] x= {{1,2},{3,4,5},{6,7}};

通过从每个子数组中选择一个int来打印所有有效组合。 一些有效的输出是:

1,3,6   
1,3,7  
1,4,6  
1,4,7
..
... etc  

到目前为止,我的代码看起来像是

public static void main(String args[]) {

int[][] x= {{1,2},{3,4,5},{6,7}};
for(int i = 0; i < x.length; i++){
 for (int j = 0; j < 3; j++){
    for (int k = 0; k < 2; k++){                
            System.out.println(x[0][i]+" " + x[1][j] +" "+ x[2][k]);            
    }
}

我的代码抛出了一个exeout indexoutofbounds。我不确定我的出路在哪里。我知道它天真的解决方案和蛮力,并且问题是解决问题的更好方法,但这个解决方案是第一个出现在我心中的解决方案。

4 个答案:

答案 0 :(得分:1)

而不是做我&lt; x.length,试试i&lt; x [0] .length x的长度为3,第一个元素的长度为2.因此,越界异常。此外,获得x [1] .length和x [2] .length而不是硬编码3和2可能是个好主意。 尝试:

public class MyClass {
    public static void main(String args[]) {
        int[][] x= {{1,2},{3,4,5},{6,7}};
        for (int i = 0; i < x[0].length; i++){
            for (int j = 0; j < x[1].length; j++){
                for(int k = 0; k < x[2].length; k++){
                    System.out.println(x[0][i] + " " + x[1][j] + " " + x[2][k]);
                }
            }
        }
    }
}

答案 1 :(得分:1)

寻找用Java 8编写的复杂内容?这是:

package com.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ArrayPrint {

    @SuppressWarnings("resource")
    public static void main(String args[]) {

        int[][] x = { { 1, 2 }, { 3, 4, 5 }, { 6, 7 } };

        Stream<List<Integer>> inputs = null;

        for (int[] set : x) {
            List<Integer> list = new ArrayList<Integer>();
            Collections.addAll(list, Arrays.stream(set).boxed().toArray(Integer[]::new));
            if (inputs == null) {
                inputs = Stream.of(list);
            } else {
                inputs = Stream.concat(inputs, Stream.of(list));
            }
        }

        Stream<List<List<Integer>>> listified = inputs.filter(Objects::nonNull).filter(input -> !input.isEmpty())
                .map(l -> l.stream().map(o -> new ArrayList<>(Arrays.asList(o))).collect(Collectors.toList()));

        List<List<Integer>> combinations = listified.reduce((input1, input2) -> {
            List<List<Integer>> merged = new ArrayList<>();
            input1.forEach(permutation1 -> input2.forEach(permutation2 -> {
                List<Integer> combination = new ArrayList<>();
                combination.addAll(permutation1);
                combination.addAll(permutation2);
                merged.add(combination);
            }));
            return merged;
        }).orElse(null);

        combinations.forEach(System.out::println);
    }

}

输出:

[1, 3, 6]
[1, 3, 7]
[1, 4, 6]
[1, 4, 7]
[1, 5, 6]
[1, 5, 7]
[2, 3, 6]
[2, 3, 7]
[2, 4, 6]
[2, 4, 7]
[2, 5, 6]
[2, 5, 7]

使用int[][] x = { { 1, 2 }, { 3, 4, 5 }, { 6, 7 }, { 8, 9, 10 } };,输出:

[1, 3, 6, 8]
[1, 3, 6, 9]
[1, 3, 6, 10]
[1, 3, 7, 8]
[1, 3, 7, 9]
[1, 3, 7, 10]
[1, 4, 6, 8]
[1, 4, 6, 9]
[1, 4, 6, 10]
[1, 4, 7, 8]
[1, 4, 7, 9]
[1, 4, 7, 10]
[1, 5, 6, 8]
[1, 5, 6, 9]
[1, 5, 6, 10]
[1, 5, 7, 8]
[1, 5, 7, 9]
[1, 5, 7, 10]
[2, 3, 6, 8]
[2, 3, 6, 9]
[2, 3, 6, 10]
[2, 3, 7, 8]
[2, 3, 7, 9]
[2, 3, 7, 10]
[2, 4, 6, 8]
[2, 4, 6, 9]
[2, 4, 6, 10]
[2, 4, 7, 8]
[2, 4, 7, 9]
[2, 4, 7, 10]
[2, 5, 6, 8]
[2, 5, 6, 9]
[2, 5, 6, 10]
[2, 5, 7, 8]
[2, 5, 7, 9]
[2, 5, 7, 10]

因此,此代码可以处理任何二维整数数组。

答案 2 :(得分:0)

关于我对评论的建议,请尝试使用此代码并查看每个for循环的更改。而不是迭代超过预定大小,如 txt1 = (TextView) findViewById(R.id.text1); txt2 = (TextView) findViewById(R.id.text2); constraintLayout = (ConstraintLayout) findViewById(R.id.constraintLayout); ViewTreeObserver vto = constraintLayout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { constraintLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); } else { constraintLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); } int text2Width = txt2.getWidth(); int layoutWidth = constraintLayout.getWidth(); txt1.setMaxWidth(layoutWidth-text2Width); } }); 我们改为根据数组的大小进行迭代,如下for(int k = 0; k < 2; k++)

for(int k = 0; k < x[1].length; k++)

只要您的外部数组只包含三个数组,您就可以执行此操作。否则你需要对你的循环更复杂,而不是像public static void main(String args[]) { int[][] x = { { 1, 2, 3}, { 3, 4, 5 }, { 6, 7 } }; for (int j = 0; j < x[0].length; j++) { for (int k = 0; k < x[1].length; k++) { for (int l = 0; l < x[2].length; l++) { System.out.println(x[0][j] + " " + x[1][k] + " " + x[2][l]); } } } } 那样对特定索引进行硬编码。这里我们直接编码索引0.

希望这会有所帮助。

答案 3 :(得分:0)

您总是可以声明一个对象数组并转换为您选择的数据类型,就像这样。

public class PrintArray{
    public static void main(String[] args){
        Object[][] myArray = {{1, 2, 3},
                              {4, 5, null},
                              {7, 8, null}};

        for(int x = 0; x < myArray.length; x++){
            for(int y = 0; y < 3; y++){
                if(myArray[x][y] != null){
                    System.out.print((int)myArray[x][y]);
                }
            }
        System.out.println();
        }
    }

}

我希望这会有所帮助