我希望代码中的某些内容能够动态生成循环及其相应的主体。现在,我的代码看起来像这样,我已经为其明确定义了每个循环和循环主体,每个循环和循环主体均基于变量“ 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;
}
我认为您可以将其替换为:
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;
}