Java-перестановка элементов ArrayList (целое число) - не может заставить его работать должным образом
Я довольно долго искал вокруг, чтобы решить свою проблему. У меня есть много проблем, решенных, но эта все еще преследует меня :S это было долгое время, когда я не касался программирования Java (Программирование в целом), так что будьте там понимание! ;)
Моя цель состоит в том, чтобы получить все возможные комбинации из массива целых чисел. Когда я использую следующий код, примененный к тестовому массиву integer {1, 2, 3, 4}, я ожидаю, что будет:1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
2 1 3 Четыре
2 1 4 3
(...)
но вот что я получаю
1 2 3 4
1 2 3 4 4 3
1 2 3 4 4 3 3 2 4 Есть ли у кого-нибудь ключ, предложение или даже решение? Заранее спасибо!
public class Calculation{
(...)
public void Permute(ArrayList<Integer> soFar,ArrayList<Integer> rest){
if(rest.isEmpty()) this.fillMatrice(convertIntegers(soFar)); // there it goes in a previously created arrow of int
else{
for(int k=0;k<rest.size();k++){
ArrayList<Integer> next=new ArrayList<Integer>();
next=soFar;
next.add(rest.get(k));
ArrayList<Integer> remaining=new ArrayList<Integer>();
List<Integer> sublist = rest.subList(0, k);
for(int a=0;a<sublist.size();a++) remaining.add(sublist.get(a));
sublist = rest.subList(k+1,rest.size());
for(int a=0;a<sublist.size();a++) remaining.add(sublist.get(a));
Permute(next,remaining);
}
}
}
public static ArrayList<Integer> convertArray(int[] integers){
ArrayList<Integer> convArray=new ArrayList<Integer>();
for(int i=0;i<integers.length;i++) convArray.add(integers[i]);
return convArray;
}
public static int[] convertIntegers(List<Integer> integers){
int[] ret = new int[integers.size()];
for(int i=0;i<ret.length;i++) ret[i]=integers.get(i).intValue();
return ret;
}
public Calculation() {
(...)
ArrayList<Integer> soFar=new ArrayList<Integer>();
int[] test={1,2,3,4};
Permute(soFar,convertArray(test));
}
2 ответа:
Вы можете попробовать
Recursion
решить эту проблему:public static void printPermutations(int[] n, int[] Nr, int idx) { if (idx == n.length) { //stop condition for the recursion [base clause] System.out.println(Arrays.toString(n)); return; } for (int i = 0; i <= Nr[idx]; i++) { n[idx] = i; printPermutations(n, Nr, idx+1); //recursive invokation, for next elements } }
Дополнительную информацию можно получить по этой ссылке: комбинаторика: генерация всех "состояний" - комбинаций массивов
Вы можете повторить ту же логику и здесь.
Попробуйте это, кажется, работает, он использует рекурсию.
public class Permute { public static List<List<Integer>> permute(Integer...myInts){ if(myInts.length==1){ List<Integer> arrayList = new ArrayList<Integer>(); arrayList.add(myInts[0]); List<List<Integer> > listOfList = new ArrayList<List<Integer>>(); listOfList.add(arrayList); return listOfList; } Set<Integer> setOf = new HashSet<Integer>(Arrays.asList(myInts)); List<List<Integer>> listOfLists = new ArrayList<List<Integer>>(); for(Integer i: myInts){ ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList.add(i); Set<Integer> setOfCopied = new HashSet<Integer>(); setOfCopied.addAll(setOf); setOfCopied.remove(i); Integer[] isttt = new Integer[setOfCopied.size()]; setOfCopied.toArray(isttt); List<List<Integer>> permute = permute(isttt); Iterator<List<Integer>> iterator = permute.iterator(); while (iterator.hasNext()) { List<java.lang.Integer> list = iterator.next(); list.add(i); listOfLists.add(list); } } return listOfLists; } public static void main(String[] args) { List<List<Integer>> permute = permute(1,2,3,4); System.out.println(permute); } }
Если вам не нравится список > вы можете легко перейти от массивов к списку, используя методы из списка и статические методы из java.утиль.Коллекции и java.утиль.Массивы.