如何使用java在集合中创建分区?

时间:2015-05-30 09:10:08

标签: java arrays sorting

我索引了一组{1,2,3,4,5}。决策变量输出是:

x[1][2] = 0
x[1][3] = 0
x[1][4] = 1
x[1][5] = 1
x[2][1] = 0
x[2][3] = 0
x[2][4] = 1
x[2][5] = 1
x[3][1] = 0
x[3][2] = 0
x[3][4] = 1
x[3][5] = 1
x[4][1] = 1
x[4][2] = 1
x[4][3] = 1
x[4][5] = 0
x[5][1] = 1
x[5][2] = 1
x[5][3] = 1
x[5][4] = 1

现在我想根据决策变量值创建分区。如果x[i][j]= 0i& j属于同一组。这就是上述问题的输出应该是两个分区:{1,2,3}{4,5}

我怎样才能在java中做到这一点?有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

static <T> void partitioning(Set<Set<T>> partition, Set<T> set) {
    L: while (true) {
        for (Set<T> p : partition) {
            for (T e : set) {
                if (p.contains(e)) {
                    partition.remove(p);
                    p.addAll(set);
                    set = p;
                    continue L;
                }
            }
        }
        partition.add(set);
        return;
    }
}

public static void main(String[] args) {
    int[][] x = new int[6][6];
    x[1][2] = 0;
    x[1][3] = 0;
    // .....
    x[5][4] = 1;
    Set<Set<Integer>> partition = new HashSet<>();
    for (int i = 1, is = x.length; i < is; ++i)
        for (int j = 1, js = x[i].length; j < js; ++j)
            if (x[i][j] == 0) {
                Set<Integer> set = new HashSet<>();
                set.add(i);
                set.add(j);
                partitioning(partition, set);
            }
    System.out.println(partition);
    // -> [[1, 2, 3], [4, 5]]
}