J'ai essayé d'implémenter en Java une combinaison qui prend différents r sur n différents. J'ai vu une implémentation qui boucle autant que r, J'ai pensé à diverses choses pour que ce soit bien si r pièces changeaient.
Le code ci-dessous est conçu pour prendre 3 sur 5.
import java.util.ArrayList;
import java.util.List;
public class Trial {
    public static void main(String[] args) {
        Trial me = new Trial();
        me.exec(args);
    }
    public void exec(String[] args) {
        //Tableau de chaînes
        String[] strArray = new String[] { "a", "b", "c", "d", "e" };
        //Obtenez la combinaison
        String[][] combinations = getCombinations(strArray, 3);
        //Sortie de résultat
        for (String[] combination : combinations) {
            for (String str : combination) {
                System.out.print("  " + str);
            }
            System.out.println();
        }
    }
    private String[][] getCombinations(String[] strArray, int selectCount) {
        //Liste des résultats d'emballage
        List<String[]> list = new ArrayList<>();
        //Je l'utilise un peu, donc je le garde dans une variable
        int len = strArray.length;
        //Trouvez la valeur maximale en binaire à partir de la longueur du tableau.
        int dec = 0;
        for (int i = 0; i < len; i++) {
            dec += Math.pow(2, i);
        }
        //Décrémenter de la valeur maximale.
        for (int num = dec; 0 < num; num--) {
            //Faites-en une chaîne de caractères de notation binaire. (0 n'est pas rempli)
            String bin = Integer.toBinaryString(num);
            if (!isCombination(bin, selectCount)) {
                //Ignorez si le nombre de 1 ne correspond pas à la sélection.
                continue;
            }
            int j = bin.length() - 1;
            int tmplen = len - bin.length();
            String[] combination = new String[selectCount];
            int idx = selectCount - 1;
            for (int i = len - 1; tmplen <= i; i--) {
                if (bin.charAt(j--) == '1') {
                    combination[idx--] = strArray[i];
                }
            }
            list.add(combination);
        }
        return list.toArray(new String[0][0]);
    }
    private boolean isCombination(String str, int selectCount) {
        int sum = 0;
        for (int i = 0; i < str.length(); i++) {
            sum += Character.getNumericValue(str.charAt(i));
        }
        if (sum == selectCount) {
            return true;
        }
        return false;
    }
}
  a  b  c
  a  b  d
  a  b  e
  a  c  d
  a  c  e
  a  d  e
  b  c  d
  b  c  e
  b  d  e
  c  d  e
La combinaison de 5 à 3 est 5! / (2! * (5-2)!) = 10 Peut-être que ça va.
Je pense qu'il y a beaucoup de place à l'amélioration en considérant les performances et en traitant de grands nombres.
c'est tout
Recommended Posts