02
Май
2016

комбинаторика-перестановка на джаве

Нужно получить все возможные перестановки. у меня был такой вопрос, хотя отметили как копию, но ответе был на джаваскрипте. Как найти все возможные комбинации из 6 цифр?

я нашел код который справляется ну с массивом до 10 элементов а мне нужно найти все варианты 60 элементов. как сделать? подумал может в файл записать варианты ? вообще задача такая 120 элементов, нужно найти все возможные комбинации, но четные можно поменять местами только с четными а нечетные с нечетными. я хотел сперва создать два массива один только с четными а другой только нечетные. получить все варианты этих массивов а потом уже из этих 2 склеивая через одну получить все варианты. код на джаве.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        int[] arr = {1,1,3,4,5};
        System.out.println(filter(arr));
        System.out.println(ordersAsStrings(arr));
    }

    public static Set<String> filter(int[] arr) {
        Set<String> s = new HashSet<String>();
        for(StringBuilder sb:orders(arr)){
            s.add(sb.toString());
        }
        return s;
    }

    public static List<String> ordersAsStrings(int[] arr) {
        List<String> l = new ArrayList<String>();
        for (StringBuilder sb : orders(arr)) {
            l.add(sb.toString());
        }
        return l;
    }

    public static List<StringBuilder> orders(int[] arr) {
        if(arr.length == 2){
            StringBuilder sb1 = new StringBuilder();
            sb1.append(arr[0]);
            sb1.append(arr[1]);
            StringBuilder sb2 = new StringBuilder();
            sb2.append(arr[1]);
            sb2.append(arr[0]);
            return Arrays.asList(sb1,sb2);
        }
        else {
            List<StringBuilder> l = new ArrayList<StringBuilder>();

            for (int i = 0; i < arr.length; i++) {
                for (StringBuilder sb : orders(excCopy(arr, i))) {
                    l.add(sb.insert(0, arr[i]));
                }
            }
            return l;
        }
    }

    private static int[] excCopy(int[] arr, int idx){
        int[] result = new int[arr.length-1];
        for(int i = 0, j = 0;i<arr.length;i++){
            if(i != idx){
                result[j++] = arr[i];
            }
        }
        return result;
    }
}

Источник: https://ru.stackoverflow.com/questions/519234/%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D0%BA%D0%B0-%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-%D0%BD%D0%B0-%D0%B4%D0%B6%D0%B0%D0%B2%D0%B5

Share

Тебе может это понравится...