【问题标题】:How to find powerset of an ArrayList of pairs: ArrayList<Pair<Integer, Integer>> pairList [duplicate]如何找到对的 ArrayList 的幂集:ArrayList<Pair<Integer, Integer>> pairList [重复]
【发布时间】:2021-02-07 04:05:03
【问题描述】:
public static void generatePowerSet(ArrayList<Pair<Integer,Integer>> pairList, int n_items) {
    Deque<Integer> set = new ArrayDeque<>();
    
    if (n_items == 0) {
        System.out.println(set);
        return;
    }
    Object[] pair_array = pairList.toArray();
    // consider the n'th element
    set.addLast((Integer) pair_array[n_items - 1]);
    generatePowerSet(pairList, n_items - 1);

    // or don't consider the n'th element
    set.removeLast();
    generatePowerSet(pairList, n_items - 1);
   
    System.out.println(set);
}

我很难找到允许我这样做的文档,到目前为止,我有这个函数来生成一个带有输入的 powerset (pairList, int n_items)

n_items 是 ArrayList 中的对数 我试图将数组列表更改为数组 (toArray()),但在传入 arrayList 时遇到类型转换问题。有没有更好的方法可以从这个数组列表中创建一个电源集?

【问题讨论】:

  • 为什么需要n_itemsArrayList 知道自己的大小,您可以通过调用方便命名的 size() 方法来获得它。

标签: java arraylist


【解决方案1】:

这是字符串元素的非递归版本。转换为使用对。

static class PowerSet implements Iterable<Set<String>> {

    private List<String> values;

    public PowerSet(List<String> values) {
        this.values = values;
    }

    @Override
    public Iterator<Set<String>> iterator() {
        return new Iterator<Set<String>>() {

            int index;
            final int size = (int) Math.pow(2, values.size());

            @Override
            public boolean hasNext() {
                return index < size;
            }

            @Override
            public Set<String> next() {

                BitSet bitSet = BitSet.valueOf(new long[]{index});
                Set<String> elements = new HashSet<>();
                int b = bitSet.nextSetBit(0);
                while (b >= 0) {
                    elements.add(values.get(b));
                    b = bitSet.nextSetBit(b + 1);
                }

                index++;
                return elements;
            }
        };
    }
}

使用简单

    List<String> values = Arrays.asList("a", "b", "c");
    PowerSet ps = new PowerSet(values);
    for(Set<String> e : ps) System.out.println(e);

会回来

[]
[a]
[b]
[a, b]
[c]
[a, c]
[b, c]
[a, b, c]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2014-01-03
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多