处理Java中的排序组

时间:2014-11-26 13:24:52

标签: java collections

我有一个像这样的Sorted输入: (按顺序A,B,C排序)

A - B - C - D - >字段

1 - 1 - 1 - 123

1 - 1 - 1 - 345

1 - 1 - 2 - 345

1 - 2 - 1 - 122

1 - 2 - 2 - 232

1 - 3 - 5 - 764

2 - 1 - 4 - 234

2 - 2 - 1 - 453

2 - 2 - 3 - 234

2 - 3 - 3 - 754

3 - 1 - 5 - 432

我想分开每组的记录。 例如,

1 - 1 - 1 - 123

1 - 1 - 1 - 345 是一个小组。

具有相同A,B和C值的记录属于同一组。

处理此事的最佳选择是什么?

注意:Java 1.6

2 个答案:

答案 0 :(得分:1)

Map<List<Integer>, List<Integer>>

第一个列表是组的标识符(在您的示例中它将是[1,1,1],第二个列表可以放置给定组的所有值(在您的示例中它将是[123,345] 。

一个非常伪的代码来填充你的群组:

    Map<List<Integer>, List<Integer>> groups;

    for (Row row : rows){
        List identifier = new ArrayList();
        identifier.add(row.A);
        identifier.add(row.B);
        identifier.add(row.C);

        groups.get(identifier).add(row.D);

    }

这看起来非常灵活,您可以轻松修改被视为标识符的列,您可以轻松浏览所有组并对其列表执行某些操作。

答案 1 :(得分:1)

如果您认为已排序的输入为List<Map<String, Object>(可能是,不?)

之类的东西
tobegrouped = [{A=1, B=1, C=1, D=1111},{A=1, B=1, C=1, D=1112}, {A=1, B=2, C=1, D=1211}]

然后想想用A,B,C(就像在sql中)将它分组,你会得到一张地图列表地图的地图

grouped = {1={1={1=[{D=111, A=1, B=1, C=1}, {D=1111, A=1, B=1, C=1}], 2=[{D=112, A=1, B=1, C=2}]}, 2={1=[{D=121, A=1, B=2, C=1}]}}}

编辑更好地查看分组元素

{
    1: {
        1: {
            1: [{
                D: 111,
                A: 1,
                B: 1,
                C: 1
            },
            {
                D: 1111,
                A: 1,
                B: 1,
                C: 1
            }],
            2: [{
                D: 112,
                A: 1,
                B: 1,
                C: 2
            }]
        },
        2: {
            1: [{
                D: 121,
                A: 1,
                B: 2,
                C: 1
            }]
        }
    }
}

现在,你可以通过调用groups.get(&#34; A&#34;)来获取小组的元素。得到(&#34; B&#34;)。得到(&#34; C&# 34;)(在现实世界中你必须施放)。

这里是一个按功能分组在Map of Map上的示例(我用它来对数据库中的行进行分组)。 这是一般性的,因此您可以根据需要进行规范。

public static Map<String, Object> groupby(List<? extends Map<String, Object>> tobegrouped, String...groupby) {
    if (groupby == null || groupby.length == 0) {
        for (String firstkey : tobegrouped.get(0).keySet()) {
            groupby = new String[1];
            groupby[0] = firstkey;
            break;
        }
    }
    Map<String, Object> result = new LinkedHashMap<String, Object>();
    LinkedHashMap<String, List<Map<String, Object>>> themap = new LinkedHashMap<String, List<Map<String, Object>>>();
    for (Map<String, Object> arow : tobegrouped) {
        List<Map<String, Object>> l = themap.get(arow.get(groupby[0]).toString());
        if (l == null) {
            themap.put(arow.get(groupby[0]).toString(), new ArrayList<Map<String, Object>>());
        }
        themap.get(arow.get(groupby[0]).toString()).add(arow);
    }

    if (groupby.length > 1) {
        for (Entry<String, List<Map<String, Object>>> grouped : themap.entrySet()) {
            String[] _groupby = new String[groupby.length - 1];
            for (int i = 1; i < groupby.length; i++) {
                _groupby[i-1] = groupby[i];
            }
            Map<String, Object> _grouped = MyUtils.groupby(grouped.getValue(), _groupby);
            result.put(grouped.getKey(), _grouped);
        }
    } else {
        for (Entry<String, List<Map<String, Object>>> grouped : themap.entrySet()) {
            result.put(grouped.getKey(), grouped.getValue());
        }
    }
    return result;
}