在文本文件中,数据的分布如下所示,我将此视为表格。
Column1 Column2 Column3 Column4
A B 1 2
A B 1 5
A C 1 3
B C 2 3
C A 3 4
A B 4 5
如果column1和column2相同,我需要聚类相同的值,如A->B
重复3次这样的组合。
A B 1 2
A B 1 5
A B 4 5
答案 0 :(得分:1)
这是我将如何做到的。
Map<RecordKey, List<Record>>
。答案 1 :(得分:0)
提供内存不是问题,只需将它们加载到List
中,然后将这两列作为复合键对它们进行排序将使它们聚类。我建议创建一个简单的类来存储每条记录,然后使用list.sort(new Comparator<MyRecord>(){...});
如果您确定钥匙中没有null
,则比较方法会非常简单:
@Override
public int compare(MyRecord a, MyRecord b) {
int n = a.getFirst().compareTo(b.getFirst());
if (n == 0)
return a.getSecond().compareTo(b.getSecond());
return n;
}
如果你可以有空值那么你需要更加小心并检查它们
答案 2 :(得分:0)
您可以使用此类地图结构。
Map<String, Map<String, List<Record>>> parentMap
记录是一个pojo,您可以在其中存储整个记录。
public class Record {
private String column1;
private String column2;
private Integer column3;
private Integer column4;
//getter setter
}
在地图上你可以这样说。
Map<String, Map<String, List<Record>>> parentMap = new HashMap<String, Map<String,List<Record>>>();
Map<String, List<Record>> innerMap;
List<Record> innerList;
Record r;
for (Record loop) {
innerMap = parentMap.get(column1);
if (innerMap == null || innerMap.size() == 0) {
innerMap = new HashMap<String, List<Record>>();
parentMap.put(column1, innerMap);
}
innerList = innerMap.get(column2);
if (innerList == null || innerList.size() == 0) {
innerList = new ArrayList<Record>();
innerMap.put(column2, innerList);
}
r = new Record();
//set values in r
innerList.add(r);
}