我有一个像这样的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
答案 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;
}