Контролировать порядок элементов в наборе мощности

1

У меня есть этот код, который генерирует набор мощности для заданного набора элементов. В примере мои элементы - 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 
  • 0
    Определить порядок . Затем объясните, что вы пытались добиться этого результата или что вас сдерживает.
  • 0
    Упорядоченный означает, что приоритет отдается наименьшему размеру набора, а затем наименьшему числу. Что сдерживает меня, так это то, что я не знаю, что определяет порядок набора во-первых.
Показать ещё 3 комментария
Теги:

1 ответ

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 
  • 1
    Это было намного проще, чем пытаться изменить реальный метод powerSet. Спасибо
  • 1
    @ Глаза, пожалуйста

Ещё вопросы

Сообщество Overcoder
Наверх
Меню