#java #recursion
#java #рекурсия
Вопрос:
Я пишу рекурсивную процедуру для возврата перестановки строки
Я получаю желаемый вывод, напечатанный на консоли. Однако я хотел бы добавить вывод в массив, чтобы иметь возможность работать над ним дальше. Как я могу этого добиться?
import java.util.*;
public class Permutation {
public static void main(String args[]) {
permute("A", "BCD");
}
public static void permute(String FirstElement, String Remainder) {
List<String> mylist_tobuild = new ArrayList<String>();
if (Remainder.length() <= 1) {
FirstElement = FirstElement Remainder;
// System.out.println(FirstElement);
mylist_tobuild.add(FirstElement);
System.out.println(mylist_tobuild);
}
else
for (int i = 0; i < Remainder.length(); i ) {
try {
String newString = Remainder.substring(0, i) Remainder.substring(i 1);
permute(FirstElement Remainder.charAt(i), newString);
} catch (StringIndexOutOfBoundsException exception) {
exception.printStackTrace();
}
}
}
}
Я получаю: [ABCD] [ABDC] [ACBD] [ACDB] [ADBC] [ADCB]
Я хотел бы иметь: [ABCD, ABDC, ACBD, ACDB, ADBC, ADCB,]
Ответ №1:
Вы можете указать List
в качестве аргумента:
public static void main(String args[]) {
List<String> perms = new ArrayList<>();
permute("A", "BCD",perms);
System.out.println(perms);
}
public static void permute(String FirstElement, String Remainder, List<String> perms) {
if (Remainder.length() <= 1) {
FirstElement = FirstElement Remainder;
perms.add(FirstElement);
} else {
for (int i = 0; i < Remainder.length(); i ) {
try {
String newString = Remainder.substring(0, i) Remainder.substring(i 1);
permute(FirstElement Remainder.charAt(i), newString, perms);
} catch (StringIndexOutOfBoundsException exception) {
exception.printStackTrace();
}
}
}
}
Комментарии:
1. Большое спасибо. Действительно, это было недостающее звено к проблеме!
Ответ №2:
Вы создаете новый список каждый раз, когда выполняете метод permute. Чтобы исправить это, вы можете исключить создание списка из метода (например, создать статическое поле), чтобы не создавать новый список каждый раз, когда проходите цикл. Затем добавьте свой оператор печати после вашего метода перестановки в вашем основном классе, чтобы вы могли получить конечный результат.
private static ArrayList<String> mylist_tobuild;
public static void main(String args[]) {
mylist_tobuild = new ArrayList<>(); //initialize list here once
permute("A", "BCD");
System.out.println(mylist_tobuild);
}