过滤哈希映射时输出不正确

时间:2018-05-23 10:28:13

标签: java

我有一个在String中有键和值的hashmap。数据采用(table1, "table1:ssn1,ssn2,ssn3")的形式。 key中的表名是源表名,表中的表名是目的表名,以及由"分隔的相应源系统名:"。 我试图从命令行传递参数中的源系统名称,以过滤键和值以及收到的源系统名称。 到目前为止我想出了以下代码:

public class FilterKeyValues {

    public static void main(String[] args) {
        String[] valArr;
        String ky;
        Map<String, String> hmap     = new HashMap<String, String>();
        Map<String, String> filtered = new HashMap<String, String>();

        hmap.put("Table1", "Table1:SSN1,SSN2,SSN3,SSN4,SSN5");
        hmap.put("Table2", "Table2:SSN1,SSN4,SSN2,SSN5,SSN8,SSN9,SSN10");
        hmap.put("Table3", "Table3:SSN4,SSN1");
        hmap.put("Table4", "Table4:SSN5,SSN6,SSN7");
        hmap.put("Table5", "Table5:SSN8,SSN1,SSN5,SSN2");

        if(args.length > 0) {
            for(String ssname: args) {
                for (Entry<String, String> entry : hmap.entrySet()) {
                    if (entry.getValue().contains(ssname)) {
                        ky      = entry.getKey();
                        valArr  = entry.getValue().split(":");
                        filtered.put(ky, valArr[0]+":"+ssname);
                    }
                }
            }
        }

        for (String iter: filtered.keySet()){
            String key = iter.toString();
            String value = filtered.get(key).toString();  
            System.out.println(key + "->" + value);
        }

    }
}

在参数中,我传递的是:参数中的SSN1 SSN2。输出应为

Table1->Table1:SSN1
Table2->Table2:SSN1
Table3->Table3:SSN1
Table5->Table5:SSN1
Table1->Table1:SSN2
Table2->Table2:SSN2
Table5->Table5:SSN2

相反,我得到了输出:

Table2->Table2:SSN2
Table3->Table3:SSN1
Table5->Table5:SSN2
Table1->Table1:SSN2

有谁能让我知道我在这里做的错误是什么?

3 个答案:

答案 0 :(得分:4)

您正尝试使用相同的密钥将多个值放入Map。对于每个键,地图只能保留一个值。

因此,最后只能看到为任何给定键添加的最后一个值。

一般来说,您的代码表明字符串不是数据的正确数据类型,您应该以更结构化的形式(例如Map<String,List<String>>)存储它。

答案 1 :(得分:0)

正如我所观察到的,密钥包含在值中..因此您可以使用简单的arraylist来获取目标数据..这可能会对您有所帮助

public static void main(String[] args) {
        String[] valArr;
        String ky;
        Map<String, String> hmap     = new HashMap<String, String>();
        List<String> filtered = new ArrayList<String>();

        hmap.put("Table1", "Table1:SSN1,SSN2,SSN3,SSN4,SSN5");
        hmap.put("Table2", "Table2:SSN1,SSN4,SSN2,SSN5,SSN8,SSN9,SSN10");
        hmap.put("Table3", "Table3:SSN4,SSN1");
        hmap.put("Table4", "Table4:SSN5,SSN6,SSN7");
        hmap.put("Table5", "Table5:SSN8,SSN1,SSN5,SSN2");

        if(args.length > 0) {
            for(String ssname: args) {
                for (Entry<String, String> entry : hmap.entrySet()) {
                    if (entry.getValue().contains(ssname)) {
                        ky      = entry.getKey();
                        valArr  = entry.getValue().split(":");
                        filtered.add(valArr[0]+":"+ssname);
                    }
                }
            }
        }

        for (String iter: filtered){
            System.out.println(iter.split(":")[0]+ "->" + iter);
        }

    }

答案 2 :(得分:0)

你需要迭代这些项目:

valArr  = entry.getValue().substring(entry.getValue().indexOf(":")).split(",");

这是完整的代码,可以生成您想要的输出:

public static void main(String[] args) {
    String[] valArr;
    String ky;
    Map<String, String> hmap     = new HashMap<String, String>();
    Map<String, String> filtered = new HashMap<String, String>();

    hmap.put("Table1", "Table1:SSN1,SSN2,SSN3,SSN4,SSN5");
    hmap.put("Table2", "Table2:SSN1,SSN4,SSN2,SSN5,SSN8,SSN9,SSN10");
    hmap.put("Table3", "Table3:SSN4,SSN1");
    hmap.put("Table4", "Table4:SSN5,SSN6,SSN7");
    hmap.put("Table5", "Table5:SSN8,SSN1,SSN5,SSN2");

    if(args.length > 0) {
        for(String ssname: args) {
            for (Entry<String, String> entry : hmap.entrySet()) {
                if (entry.getValue().contains(ssname)) {
                    ky      = entry.getKey();
                    valArr  = entry.getValue().substring(entry.getValue().indexOf(":")).split(",");
                    for (String val : valArr) {
                        if (val.equals(ssname)) {
                            filtered.put(ky, ky+":"+ssname);
                        }
                    }
                }
            }
        }
    }

    for (String iter: filtered.keySet()){
        String key = iter.toString();
        String value = filtered.get(key).toString();  
        System.out.println(key + "->" + value);
    }

}