比较HashMaps的ArrayList,确定哪一行具有特定键的最高值

时间:2014-07-09 00:58:06

标签: java hashmap

这很难解释,但我会尽力而为。

我在excel中有一个数据文件,其中每一行都是一个单独的条目。数据文件跟踪一个条目的所有版本,因此单个唯一项目有多个行,并且可以有多个项目。以下是数据集的示例:

第一个值(苹果,梨,葡萄)是我想要分组的唯一值,最后一个值是我只想要最新(最高数字)的版本号。

row1 apples,computer,1
row2 apples,laptop,2
row3 apples,tablet,3
row4 pear,tablet,1
row5 pear,tablet,2
row6 grape,tablet,1

我正在寻找的是以下内容:我已经采用了每个组的最新版本(基于唯一标识符 - 第一个字段)

row1 apples,tablet,3
row2 pear,tablet,2
row3 grape,tablet,1

现在我有一个方法可以读取excel文件并将每行数据放在一个arraylist(ArrayList<HashMap<String,String>>)条目中,该条目有一个hashmap来映射字段名称(列标题)和值。所有字段都是String。

row1(fieldName1:apples,fieldName2:computer,fieldName3:1)
row2(fieldName1:apples,fieldName2:laptop,fieldName3:2)
row3(fieldName1:apples,fieldName2:tablet,fieldName3:3)
row1(fieldName1:pear,fieldName2:computer,fieldName3:1)
row2(fieldName1:pear,fieldName2:laptop,fieldName3:2)
row3(fieldName1:grape,fieldName2:tablet,fieldName3:1)

fieldName1将是唯一标识符,fieldName3将是版本号 关于如何做到这一点的任何想法或想法?如果您需要任何澄清,请告诉我们!

提前致谢

1 个答案:

答案 0 :(得分:0)

只需修改列和比较器,就可以按照您要查找的方式进行比较。如果你再次从Map切换到适当的类,你需要做的就是调整比较器。请注意,在这种情况下,Long.valueOf可能会在您的列不包含长字时抛出异常。

final String column = "foo";
Map<String, String> max = Collections.min(table, new Comparator<Map<String, String>>() {
    @Override
    public int compare(Map<String, String> o1, Map<String, String> o2) {
        long l1 = Long.valueOf(o1.get(column).trim());
        long l2 = Long.valueOf(o2.get(column).trim());
        return Long.compare(l1, l2);
    }
});