如何在hashmap中循环下一个元素

时间:2016-09-09 13:03:44

标签: java for-loop hashmap

我有一组像这样的字符串

A_2007-04, A_2007-09, A_Agent, A_Daily, A_Execute, A_Exec, B_Action, B_HealthCheck

我希望输出为:

Key = A, Value = [2007-04,2007-09,Agent,Execute,Exec]
Key = B, Value = [Action,HealthCheck]

我正在使用HashMap执行此操作

pckg:{A,B}
count:total no of strings
reports:set of strings

我使用的逻辑是嵌套循环:

for (String l : reports[i]) {
    for (String r : pckg) {
        String[] g = l.split("_");
        if (g[0].equalsIgnoreCase(r)) {
            report.add(g[1]);
            dirFiles.put(g[0], report);
        } else {
            break;
        }
    }
}

我的输出为

Key = A, Value = [2007-04,2007-09,Agent,Execute,Exec]

如何获得第二把钥匙? 有人可以为此提出逻辑吗?

4 个答案:

答案 0 :(得分:1)

假设您使用Java 8,可以使用computeIfAbsent来初始化值为List的值,当它是下一个新密钥时:

List<String> tokens = Arrays.asList(
    "A_2007-04", "A_2007-09", "A_Agent", "A_Daily", "A_Execute", 
    "A_Exec", "P_Action", "P_HealthCheck"
);
Map<String, List<String>> map = new HashMap<>();
for (String token : tokens) {
    String[] g = token.split("_");
    map.computeIfAbsent(g[0], key -> new ArrayList<>()).add(g[1]);
}

答案 1 :(得分:0)

for (String l : reports[i]) {
        String[] g = l.split("_");
        for (String r : pckg) {
            if (g[0].equalsIgnoreCase(r)) {
                report = dirFiles.get(g[0]);
                if(report == null){ report = new ArrayList<String>(); } //create new report
                report.add(g[1]);
                dirFiles.put(g[0], report);
            }
        }
}
  • 删除了else条件的if部分。你正在那里使用break来退出内部循环,你永远不会评估超出第一个键的键。
  • 添加了对现有值的检查。正如Orin2005所建议的那样。
  • 此外,我已将语句String[] g = l.split("_");移到内部循环之外,以免多次执行。

答案 2 :(得分:0)

就原始代码而言,这应该是我认为你想要实现的目标:

// Create a collection of String any way you like, but for testing
// I've simply split a flat string into an array.
String flatString = "A_2007-04,A_2007-09,A_Agent,A_Daily,A_Execute,A_Exec,"
        + "P_Action,P_HealthCheck";
String[] reports = flatString.split(",");

Map<String, List<String>> mapFromReportKeyToValues = new HashMap<>();

for (String report : reports) {
    int underscoreIndex = report.indexOf("_");
    String key = report.substring(0, underscoreIndex);
    String newValue = report.substring(underscoreIndex + 1);
    List<String> existingValues = mapFromReportKeyToValues.get(key);
    if (existingValues == null) {
        // This key hasn't been seen before, so create a new list
        // to contain values which belong under this key.
        existingValues = new ArrayList<>();
        mapFromReportKeyToValues.put(key, existingValues);
    }
    existingValues.add(newValue);
}

System.out.println("Generated map:\n" + mapFromReportKeyToValues);

虽然我建议整理它并将其组织成适合您项目代码的方法。

答案 3 :(得分:0)

使用Map<String, ArrayList<String>>执行此操作将是我认为的另一种好方法:

    String reports[] = {"A_2007-04", "A_2007-09", "A_Agent", "A_Daily", 
                        "A_Execute", "A_Exec", "P_Action", "P_HealthCheck"};
    Map<String, ArrayList<String>> map = new HashMap<>();

    for (String rep : reports) {

        String s[] = rep.split("_");
        String prefix = s[0], suffix = s[1];
        ArrayList<String> list = new ArrayList<>();

        if (map.containsKey(prefix)) {
            list = map.get(prefix);
        }

        list.add(suffix);
        map.put(prefix, list);
    }

    // Print
    for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) {
        String key = entry.getKey();
        ArrayList<String> valueList = entry.getValue();
        System.out.println(key + " " + valueList);
    }