Эффективный способ замены проверки containsKey методами, представленными в java8 для Map - PullRequest
1 голос
/ 13 июля 2020

Ниже приводится программа java, которая использует карту для вычисления количества вхождений букв в строке:

String str = "babbaceeeeee";
    Map<String,Integer> letterCountMap = new HashMap<>();
    for(int count =0; count<str.length(); count++){
        String letter = str.substring(count, count +1);
        if(letterCountMap.containsKey(letter)){
            int presentCount = letterCountMap.get(letter);
            letterCountMap.put(letter, presentCount + 1);
        }else{
            letterCountMap.put(letter, 1);
        }

        
    }
    System.out.println("letterCountMap ::"+letterCountMap);//prints letterCountMap ::{a=2, b=3, c=1, e=6}

Есть ли способ эффективно заменить этот код комбинацией методов, представленных в Java8 для карты, например compute (), computeIfPresent (), computeIfAbsent () et c без использования containsKey () if condition ??

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете упростить его, используя Map.merge в Map вместо полного if..else блока, например:

letterCountMap.merge(letter, 1, Integer::sum);

Общее решение можно упростить до:

Map<Character, Integer> letterCountMap = new HashMap<>();
for (char letter : str.toCharArray()) {
    letterCountMap.merge(letter, 1, Integer::sum);
}
0 голосов
/ 14 июля 2020

Принимая во внимание ответ @ Naman, чтобы использовать метод слияния, и для тех, кто не знаком со ссылкой на метод, я могу дать более ясный ответ: -

Map<String,Integer> letterCountMap = new HashMap<>();
for(int count = 0; count<str.length(); count++){
            String letter = str.substring(count, count +1);
            System.out.println("Current letter::"+letter);
            letterCountMap.merge(letter, 1, (a,b)->{
                //System.out.println("a="+a);//current value of corresponding key
                //System.out.println("b="+b);//1 in this case
                return a+b;
            }
            );
             
}
...