值聚类

时间:2014-11-11 10:02:40

标签: java hashmap

在文本文件中,数据的分布如下所示,我将此视为表格。

  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

3 个答案:

答案 0 :(得分:1)

这是我将如何做到的。

  1. 定义包含4个字段的类记录
  2. 定义一个包含行标识的RecordKey类,即两个第一列值。确保正确定义了equals和hashCode。
  3. 创建Map<RecordKey, List<Record>>
  4. 逐行阅读记录。如果地图中已存在当前记录键的列表,则将当前记录添加到此列表中。否则,创建一个新列表,将记录添加到该列表中,并将此列表放在地图中。

答案 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);
}