比较ArrayList中的相同键<hashmap <string,string =“”>&gt;基于比较删除Array中的元素</hashmap <string,>

时间:2014-07-09 15:39:46

标签: java arrays hash arraylist

以下是我目前的代码:

private void processData(StringBuffer reportBuffer) {
    String tableName = "db2_table_name";
    ArrayList<HashMap<String, String>> tableValue = FileData.get(tableName);

    String No = "No";
    String versionNumber = "VersionNumber";


    for (HashMap<String, String> fieldValue : tableValue) {

        String No = fieldValue.get(No);
        String Version = fieldValue.get(versionNumber);

        reportBuffer.append("No is: " + No + " and Version is: " +Version + NL);
    }
}

目前的输出是:

No is: 1. and Version is: 1.
No is: 1. and Version is: 2.
No is: 3. and Version is: 1.
No is: 3. and Version is: 2.
No is: 3. and Version is: 3.

我想要做的只是保留每个No的最新版本,同时删除旧版本的元素。所以在我的新ArrayList中,我理想的只想:

No is: 1. and Version is: 2.
No is: 3. and Version is: 3

如果您需要任何澄清,请告诉我们!

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以创建一个新的HashMap并为该hashmap中的每个No保存最新版本。 您可以通过在执行for循环时在hashmap中保存每个No和Version来实现这一点。但是,每次保存值之前,都应检查hashmap是否包含当前的No,如果是,则不保存但检查存储的版本是否小于当前版本并替换它。

最后,创建一个循环来绕过散列图并将其与reportBuffer.append()一起使用

答案 1 :(得分:0)

单向性

保持Map<String,Integer> lowestAmongMaps = new HashMap<String,Integer>();

在for循环中,将每个键的最低值添加到此地图中。 基本上,这样的事情

Integer currentLowest = Integer.valueOf(lowestAmongMaps.get(versionNumber));
            if(currentLowest == null){
                currentLowest = Integer.MAX_VALUE;
            }
            Integer currentVal = Integer.valueOf(Version).intValue();
            if( currentVal.intValue() < currentLowest.intValue()){
                lowestAmongMaps.put(versionNumber,currentVal);
            }

现在在下一次迭代中删除所有不是最低的键。

所以基本上你有两次迭代

for (HashMap<String, String> fieldValue : tableValue)

答案 2 :(得分:0)

如果它是数据库,最好的方法是修改查询以仅从FileData.get()返回最大版本。但我想它是一个档案。因此,一个简单的解决方案是保留第三个映射来存储报告值。例如

private void processData(StringBuffer reportBuffer) {
    String tableName = "db2_table_name";
    ArrayList<HashMap<String, String>> tableValue = FileData.get(tableName);

    String no = "No";
    String versionNumber = "VersionNumber";

    Map<String, String> mergedMap = new HashMap<String, String>();
    for (HashMap<String, String> fieldValue : tableValue) {

        String No = fieldValue.get(no);
        String Version = fieldValue.get(versionNumber);

        if(mergedMap.containsKey(No)){
            Integer previousVersion = Integer.valueOf(mergedMap.get(No));
            Integer currentVersion = Integer.valueOf(Version);
            if(currentVersion > previousVersion){
                mergedMap.put(No, Version);
            }
        } else {
            mergedMap.put(No, Version);
        }
    }

    for(Entry<String, String> entry : mergedMap.entrySet()){
        reportBuffer.append("No is: " + entry.getKey() + " and Version is: " + entry.getValue() + NL);
    }
}