如何找到排除自有数组的String数组的排列?

时间:2017-07-20 19:14:10

标签: java arrays algorithm concatenation permutation

我有以下一堆数组:

public class ArrayPermutationExample {
    private static final String PREFIX = "ignore(FAILURE) { build(\"load\", ";
    public static final String ENDING = ")}";
    private static String[] arr_1 = new String[] {
        "111",
        "222",
        "333"};

    private static String[] arr_2 = new String[]{
        "aaa",
        "bbb",
        "ccc"};

    private static String[] arr_3 = new String[] {
        "***",
        "&&&",
        "$$$"};

我需要找到其他数组的排列,排除原生数组 输出应如下所示:

111aaa
111bbb
111ccc
111***
111&&&
111$$$

222aaa
222bbb
222ccc
...

333aaa
333bbb
333ccc
...

最后,对于所有这些排列,应添加prefixending

  

prefix排列字符串endings

最后我们应该有:

  

忽略(失败){build(“load”,111aaa)}

我完全坚持使用此任务的解决方案:

private static void processArrays(String[] ... arrays) {
    ArrayList<String> result = new ArrayList<>();
    for (String[] array : arrays) {
        String[] currentArray = array;
        for (String line : currentArray) {
            // exclude all lines from current array & make concatenation with every line from others
        }
    }
}

如何解决此问题?

更新

我想最后补充一点,我们需要一个没有任何出版物的独特列表。即使是以下示例也会相互重复:

111aaa***
***111aaa

我相信这个任务应该有 Java 8 风格的解决方案。

2 个答案:

答案 0 :(得分:2)

我认为这可能是一个组合,因为你实际上并不关心获得所有的排序(除了按照数组参数的顺序指定的顺序打印),但不管怎样,这是我写的代码。我使用堆栈来存储未完成的数组。在任何给定点为每个阵列推送堆栈,并推送到任何已完成阵列的结果。

public static List<String> getCombinations(String prefix, String ending, String[]... arrays) {
    List<String> results = new ArrayList<>();
    Stack<String[]> combinations = new Stack<>();
    combinations.add(new String[arrays.length]);

    while (!combinations.isEmpty()) {
        String[] currentArray = combinations.pop();

        if (currentArray[arrays.length - 1] == null) {
            for (int i = 0; i < arrays.length; i++) {
                if (currentArray[i] == null) {
                    for (int j = 0; j < arrays[i].length; j++) {
                        String[] newArray = currentArray.clone();
                        newArray[i] = arrays[i][j];
                        combinations.add(newArray);
                    }

                    break;
                }

            }
        } else {
            StringBuilder stringBuilder = new StringBuilder(prefix);
            for (String string : currentArray) {
                stringBuilder.append(string);
            }
            stringBuilder.append(ending);
            results.add(stringBuilder.toString());
        }
    }

    return results;
}

您只需要遍历返回的列表即可打印出所有字符串。

作为补充说明,此方法可以递归编写,但我通常喜欢使用堆栈而不是使用递归,因为递归有时会很慢。

答案 1 :(得分:1)

我读它的方式:第一个数组arr_1预先添加到接下来的3个数组中。 我认为前缀是&#34;忽略(FAILURE){build(&#34; load&#34;,&#34;结尾是&#34;}}&#34;

$(document).ready(function(){
    for(var i = 0; i <= 255; i++){
        $('.grid').append('<div class="pixel"></div>');
    };
    clickDraw();
    draw();
});

var drawOn = this.false;
var clickDraw = function(){
    $('.grid').click(function(){
        $(drawOn).toggle();
    });
}
var draw = function(){
    if (drawOn === true){
        $('.pixel').mouseenter(function(){
            (this).css("background-color", "black");
        });
    }
}