HashMap:使用公共密钥添加值并将其打印出来

时间:2013-02-08 22:10:54

标签: java algorithm data-structures

我的文件中有key/value形式的字符串,就像人和计数一样,例如

"Reggy, 15"
"Jenny, 20"
"Reggy, 4"
"Jenny, 5"

并且在输出中我应该根据键总结所有计数值,因此我们的示例输出将是

“Reggy,19” “珍妮,25岁”

这是我的方法:

  1. 阅读每一行,每行获取密钥并使用扫描仪进行计数并将,作为分隔符
  2. 现在看看key是否已经存在,如果没有那么只是将currentValues添加到previousValues,如果没有,则将currentValue作为HashMap的值。
  3. 示例实施:

    public static void main(final String[] argv) {
        final File file = new File("C:\\Users\\rachel\\Desktop\\keyCount.txt");
    
        try {
            final Scanner scanner = new Scanner(file);
    
            while (scanner.hasNextLine()) {
                if (scanner.hasNext(".*,")) {
                    String key;
                    final String value;
    
                    key = scanner.next(".*,").trim();
    
                    if (!(scanner.hasNext())) {
                        // pick a better exception to throw
                        throw new Error("Missing value for key: " + key);
                    }
    
                    key = key.substring(0, key.length() - 1);
                    value = scanner.next();
    
                    System.out.println("key = " + key + " value = " + value);
                }
            }
        } catch (final FileNotFoundException ex) {
            ex.printStackTrace();
        }
    }
    

    第一部分我不清楚如何在读取它们时划分键/值对并根据它创建HashMap。

    这也是我建议的最佳方法,还是有提高性能的方法。

6 个答案:

答案 0 :(得分:8)

由于这几乎肯定是一个学习练习,我将远离编写代码,让你享受所有的乐趣。

创建HashMap<String,Integer>。每次看到键/值对时,检查哈希映射是否具有键的值(使用'containsKey(key)')。如果是,请使用get(key)获取旧值,添加新值,然后使用put(key, newValue)存储结果。如果密钥还没有,请添加一个新密钥 - 再次使用put。如果int(请使用String value),请不要忘记Integer.valueOf(value)

就优化而言,此时的任何优化都为时过早:它甚至都不起作用!但是,很难比单个循环更快,这也很简单。

答案 1 :(得分:2)

对于阅读,个人而言,我会使用:

Scanner.nextLine()String.split(",")Integer.valueOf(value)

答案 2 :(得分:2)

试试这个:

Map<String, Long> map = new HashMap<String, Long>();

while (scanner.hasNextLine()) {
        if (scanner.hasNext(".*,")) {
            ....
            if(map.containsKey(key))
                map.put(key, map.get(key) + Long.valueOf(value));
            else
                map.put(key, Long.valueOf(value));
        }
    }

答案 3 :(得分:2)

最简单的方法我可以考虑拆分值:

    BufferedReader reader =  new BufferedReader(new FileReader(file));
    Map<String, Integer> mapping = new HashMap<String,Integer>();

    String currentLine;
    while ((currentLine = reader.readLine()) != null) {

        String[] pair  = currentLine.split(",");

         if(pair.length != 2){ //could be less strict
            throw new DataFormatException();
         }

         key = pair[0];
         value = Integer.parseInt(pair[1]);
         if(map.contains(key)){
             value +=  map.get(key);
         }
         map.put(key,value);
    }

在性能方面,它很可能不是最有效的方式,但非常简单。 Scanner通常用于解析,但这里的解析看起来并不复杂,只是字符串的拆分。

答案 4 :(得分:0)

一种时间复杂度为O(n)的后期但干净的解决方案。该解决方案绕过了一些数组

 public class Solution {

    public static void main(String[] args) {
    // Anagram
            String str1 = "School master";
            String str2 = "The classroom";


            char strChar1[] = str1.replaceAll("[\\s]", "").toLowerCase().toCharArray();
            char strChar2[] = str2.replaceAll("[\\s]", "").toLowerCase().toCharArray();

            HashMap<Character, Integer> map = new HashMap<Character, Integer>();

            for (char c : strChar1) {
                if(map.containsKey(c)){
                    int value=map.get(c)+1;
                    map.put(c, value);
                 }else{
                     map.put(c, 1);
                 }

            }

            for (char c : strChar2) {
                if(map.containsKey(c)){
                    int value=map.get(c)-1;
                    map.put(c, value);
                 }else{
                     map.put(c, 1); 
                 }
            }

            for (char c : map.keySet()) {
                if (map.get(c) != 0) {
                    System.out.println("Not anagram");
                }
            }
                    System.out.println("Is anagram");
        }
    }

答案 5 :(得分:0)

public Map<String, Integer> mergeMaps(@NonNull final Map<String, Integer> mapOne,
                                          @NonNull final Map<String, Integer> mapTwo) {
        return Stream.of(mapOne.entrySet(), mapTwo.entrySet())
                .flatMap(Collection::stream)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Integer::sum));
    }