Such Ich werde einen Artikel schreiben, da sowohl Kombinationen als auch Bestellungen nachgefragt werden müssen. In unserem Unternehmen wird dieser kleine Code für Produkte verwendet, die mehrere Finanzprodukte kombinieren, um ein Portfolio zu erstellen, und dann das mit guten Eigenschaften auswählen. Das Funktionsprinzip ist fast das gleiche wie oben.
Combination.java
private enum Operation {add, remove};
private static<T> Set<T> apply(Set<T> src, Operation operation, T item) {
Set<T> result = new HashSet<T>(src);
if (Operation.add == operation) result.add(item);
if (Operation.remove == operation) result.remove(item);
return result;
}
private static<T> Set<Set<T>> _combination(Set<T> selected, int depth, Set<T> pool) {
if (depth == 0) return apply(new HashSet<>(), Operation.add, selected); //Gibt die Menge zurück, die nur die ausgewählten im Element haben
Set<Set<T>> result = new HashSet<Set<T>>();
for (T item : pool) {
result.addAll(
_combination(
apply(selected, Operation.add, item), //Ändern Sie das Element in ausgewählt
depth - 1,
apply(pool, Operation.remove, item) //Aus dem Pool nehmen
)
);
}
return result;
}
public static<T> Set<Set<T>> combination(Set<T> src, int k) {return _combination(new HashSet<T>(), k, src);}
So was.
Main.java
public static void main(String[] args) {
Set<Integer> src = new HashSet<Integer>() {{
add(0); add(1); add(2); add(3); add(4); add(5);
}};
System.out.println(combination(src, 2)); //Listen Sie alle Sätze auf, die durch Extrahieren von zwei aus den obigen Sätzen erhalten wurden
}