有没有办法在Java中自动生成动态代码?

问题描述 投票:1回答:1

我希望代码中的某些内容能够动态生成循环及其相应的主体。现在,我的代码看起来像这样,我已经为其明确定义了每个循环和循环主体,每个循环和循环主体均基于变量“ len”的值运行。如何更改它,以便动态生成诸如我为每种条件编写的循环代码?

ArrayList<String> mapAll(String input){
        int len = input.length();
        ArrayList<String> outputs= new ArrayList<>();
        //String[] outputs = new String[len];
        ArrayList<String> outputStrings= new ArrayList<>();
        for (int i = 0; i <len ; i++)
            outputs.add(mapOne(Character.toString(input.charAt(i))));

        if (len == 1)
            for (int i = 0; i <outputs.get(len -1).length() ; i++)
                    outputStrings = outputs;

        else if (len == 2)
            for (int i = 0; i <outputs.get(len-2).length() ; i++)
                for (int j = 0; j < outputs.get(len - 1).length(); j++)
                    outputStrings.add(Character.toString(outputs.get(len - 2).charAt(i)) + outputs.get(len - 1).charAt(j));



        else if(len == 3)
            for (int i = 0; i <outputs.get(len-3).length(); i++)
                for (int j = 0; j <outputs.get(len-2).length(); j++)
                    for (int k = 0; k <outputs.get(len-1).length(); k++)
                        outputStrings.add(Character.toString(outputs.get(len-3).charAt(i)) + outputs.get(len - 2).charAt(j) + outputs.get(len - 1).charAt(k));


        else if(len==4)
            for (int i = 0; i < outputs.get(len-4).length(); i++)
                for(int j = 0; j < outputs.get(len-3).length(); j++)
                    for(int k = 0; k < outputs.get(len-2).length(); k++)
                        for(int l = 0; l < outputs.get(len-1).length(); l++)
                            outputStrings.add(Character.toString(outputs.get(len-4).charAt(i)) + outputs.get(len-3).charAt(j) + outputs.get(len-2).charAt(k)+ outputs.get(len-2).charAt(l));


        return outputStrings;
    }
java loops dynamic-programming code-generation
1个回答
0
投票

我认为您可以将其替换为:

private static void doIt(ArrayList<String> outputs, int len, ArrayList<String> outputStrings) {
    IntStream.range(0, outputs.size() - len)
            .mapToObj(i -> IntStream.range(0, len).mapToObj(j -> outputs.get(j + i)).collect(Collectors.toList()))
            .map(list -> String.join("", list))
            .forEach(s -> outputStrings.add(s));
}

或不带流:

private static void doIt(ArrayList<String> outputs, int len, ArrayList<String> outputStrings) {
    for (int i = 0; i < outputs.size() - len ; i++) {
        ArrayList<String> list = new ArrayList<>();
        for (int j = 0; j < len; j++) {
            list.add(outputs.get(j + i));
        }
        outputStrings.add(String.join("", list));
    }
}

比您可以更改的代码:

    ArrayList<String> mapAll(String input){
        int len = input.length();
        ArrayList<String> outputs= new ArrayList<>();
        //String[] outputs = new String[len];
        ArrayList<String> outputStrings= new ArrayList<>();
        for (int i = 0; i <len ; i++)
            outputs.add(mapOne(Character.toString(input.charAt(i))));

        if (len == 1)
            for (int i = 0; i <outputs.get(len -1).length() ; i++)
                outputStrings = outputs;

        else if (len == 2)
            doIt(outputs, 2, outputStrings);

        else if(len == 3)
            doIt(outputs, 3, outputStrings);

        else if(len==4)
            doIt(outputs, 4, outputStrings);

        return outputStrings;
    }

或更短]

    ArrayList<String> mapAll(String input){
        int len = input.length();
        ArrayList<String> outputs= new ArrayList<>();
        //String[] outputs = new String[len];
        ArrayList<String> outputStrings= new ArrayList<>();
        for (int i = 0; i <len ; i++)
            outputs.add(mapOne(Character.toString(input.charAt(i))));

        if (len == 1)
            for (int i = 0; i <outputs.get(len -1).length() ; i++)
                outputStrings = outputs;
        else 
            doIt(outputs, len , outputStrings);

        return outputStrings;
    }
© www.soinside.com 2019 - 2024. All rights reserved.