У меня есть этот код, который генерирует набор мощности для заданного набора элементов. В примере мои элементы - 1, 2 и 3. Таким образом, это генерирует...
{1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}
import java.util.ArrayList;
import java.util.List;
public class test {
static List<List<Integer>> powerSet;
public static void main(String[] args) {
powerSet = getPowerSet(new ArrayList<Integer>() {
{
add(1);
add(2);
add(3);
}
});
for (List<Integer> i : powerSet) {
for (Integer i2 : i) {
System.out.print(i2 + " ");
}
System.out.println();
}
}
private static List<List<Integer>> getPowerSet(List<Integer> itemList) {
List<List<Integer>> ps = new ArrayList<List<Integer>>();
ps.add(new ArrayList<Integer>()); // add the empty set
// for every item in the original list
for (Integer i : itemList) {
List<List<Integer>> newPs = new ArrayList<List<Integer>>();
for (List<Integer> subset : ps) {
// copy all of the current powerset subsets
newPs.add(subset);
// plus the subsets appended with the current item
List<Integer> newSubset = new ArrayList<Integer>(subset);
newSubset.add(i);
newPs.add(newSubset);
}
// powerset is now powerset of list.subList(0, list.indexOf(item)+1)
ps = newPs;
}
ps.remove(0); // remove the emptyset
return ps;
}
}
Проблема в том, что мой результат не упорядочен, вот что я получаю.
3
2
2 3
1
1 3
1 2
1 2 3
Я хотел бы получить:
1
2
3
1 2
1 3
2 3
1 2 3
Вы можете сортировать их, используя Collections.sort
с некоторой логикой для его сортировки, сначала проверив ее длину, если она равна друг другу и разглашает ее на int. Но вам нужно сначала сохранить список чисел в строке, чтобы вы могли проверить длину и точность целого числа.
образец:
Collections.sort(powerSet, new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> o1, List<Integer> o2) {
StringBuilder temp = new StringBuilder();
StringBuilder temp2 = new StringBuilder();
for (Integer i2 : o1) {
temp.append( i2 );
}
for (Integer i2 : o2) {
temp2.append( i2 );
}
if(temp.length() == temp2.length())
return Integer.parseInt(temp.toString()) - Integer.parseInt(temp2.toString());
else
return temp.length() - temp2.length();
}
});
результат:
1
2
3
1 2
1 3
2 3
1 2 3