【问题标题】:Hashmap implementation to count the occurrences of each characterHashmap 实现来计算每个字符的出现次数
【发布时间】:2011-05-20 19:18:19
【问题描述】:

下面的代码是计算每个字符的出现次数,它应该打印计数。 但是使用我尝试过的代码,我只得到一个 1,我不知道我应该进行哪些更改。

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

class Count_CharMap {
public static void main(String[] args) {
    try
    {
        FileInputStream file = new FileInputStream("D:\\trial.txt");
        DataInputStream dis = new DataInputStream(file);
        BufferedReader br = new BufferedReader(new InputStreamReader(dis));
        String Contents="";
        String str="";

        while ((Contents = br.readLine()) != null) {
            str+=Contents;
        }

        char[]char_array =str.toCharArray();
        int count = 0;
        char ch = char_array[count];
        Map<Character,Integer> charCounter=new HashMap<Character,Integer>();
        for(int i=0;i<str.length();i++)
        {
            if(charCounter.containsKey(char_array[i]))
            {
                charCounter.put(ch, charCounter.get(ch)+1);
            } 
            else
            {
                charCounter.put(ch, 1);
            }
       }

       for(Character key:charCounter.keySet())
       {
           System.out.println(key+""+charCounter.get(key));
       }
    } 
    catch(IOException e1){
        System.out.println(e1);
    }
    }
}

实际输出应该是这样的 如果我的 trial.txt 中有 abcdabc,它应该打印 a 2 b 2c 2 d 1。

【问题讨论】:

  • 正确缩进你的代码,它会帮助你获得帮助。

标签: java collections


【解决方案1】:

在每次执行循环时,您都将 char ch 设置为相同的字符。

应该是:

ch = char_array[i]; 
if(charCounter.containsKey(ch)){
     charCounter.put(ch, charCounter.get(ch)+1);
}
else
{
    charCounter.put(ch, 1);
}

在 for 循环中。

【讨论】:

  • 非常感谢。愚蠢的我 :-) 代码完美地打印了所有字符和出现。我想按字母顺序打印它们。该怎么做?
  • 使用树形图而不是哈希图,它应该这样做。如果不是,您将不得不使用比较器对其进行排序,谷歌它。 download.oracle.com/javase/1.4.2/docs/api/java/util/…
【解决方案2】:

Java 8 流:

Map<String, Long> map = 
    Arrays.stream(string.split("")).
    collect(Collectors.groupingBy(c -> c, Collectors.counting()));

番石榴HashMultiset:

Multiset<Character> set = HashMultiset.create(Chars.asList("bbc".toCharArray()));
assertEquals(2, set.count('b'));

【讨论】:

    【解决方案3】:

    Hai All 下面的代码是计算每个字符的出现次数,它应该打印计数。可能对你有帮助..谢谢你看到

    包 com.corejava;

    import java.util.Map;
    import java.util.TreeMap;
    
    public class Test {
        public static void main(String[] args) {
    
            String str = "ramakoteswararao";
    
            char[] char_array = str.toCharArray();
    
            System.out.println("The Given String is : " + str);
    
        Map<Character, Integer> charCounter = new TreeMap<Character, Integer>();
    
            for (char i : char_array) {
    
        charCounter.put(i,charCounter.get(i) == null ? 1 : charCounter.get(i) + 1);
    
            }
    
        for (Character key : charCounter.keySet()) {
      System.out.println("occurrence of '" + key + "' is  "+ charCounter.get(key));
            }
    
        }
    
    }
    

    【讨论】:

    • 嗨,欢迎来到 SO。当您在代码中发布解决方案时,包含一个简短的思路总结可能会有所帮助。
    【解决方案4】:
    import java.util.HashMap;
    import java.util.Map;
    ...
    Map<String, Integer> freq = new HashMap<String, Integer>();
    ...
    int count = freq.containsKey(word) ? freq.get(word) : 0;
    freq.put(word, count + 1);
    

    【讨论】:

      【解决方案5】:

      在for循环中

      ch = char_array[i];
      charCounter.put(charCounter.contains(ch)?charCounter.get(ch)+1:1);

      【讨论】:

        【解决方案6】:
        import java.util.TreeMap;
        
        public class OccuranceDemo {
            public static void main(String[] args) {
                TreeMap<String , Integer> mp=new TreeMap();
                String s="rain rain go away";
                String[] arr = s.split(" ");
                int length=arr.length;
                for(int i=0;i<length;i++)
               {
                 String h = arr[i];
                mp.put(h, mp.get(h)==null?1:mp.get(h)+1);
            }
            System.out.println(mp.get("go"));
          }
        }
        

        【讨论】:

        • 如果我们需要我们在上面的例子中获取任何其他键,我们已经采取了 go
        • 嗨,欢迎来到 SO。一个很好的第一次尝试,但你的答案实际上并没有满足许多要求:(1)它计算单词,而不是字符(2)它不打印单词和最后的计数 - 不适用于任意字符串 (3) 它不是 Hashmap,正如所问的那样 (4) 它实际上并没有修复询问者的代码,而是提供了另一种解决方案。以后提问前请仔细阅读问题。请参阅本指南:stackoverflow.com/help/how-to-answer
        【解决方案7】:
            String str=new String("aabbbcddddee");
            char[] ch=str.toCharArray();
            HashMap<Character,Integer> hm=new HashMap<Character,Integer>();
            for(char ch1:ch)
            {
        
                if(hm.containsKey(ch1))
                {
                    hm.put(ch1,hm.get(ch1)+1);
                }
                else
                {
                    hm.put(ch1,1);
                }
            }
        
            Set s1=hm.entrySet();
            Iterator itr=s1.iterator();
        
            while(itr.hasNext())
            {
                Map.Entry m1=(Map.Entry)itr.next();
                System.out.println(m1);
            }
        

        【讨论】:

          【解决方案8】:
          import java.util.*;
          
          public class Test {
              public static void main(String[] args) {
          
                  String str = "STACKOVERFLOW";
          
                  char[] char_array = str.toCharArray();
          
                  System.out.println("The Given String is : " + str);
          
              Map<Character, Integer> charCounter = new TreeMap<Character, Integer>();
          
                  for (char i : char_array) {
          
              charCounter.put(i,charCounter.get(i) == null ? 1 : charCounter.get(i) + 1);
          
                  }
          
              for (Character key : charCounter.keySet()) {
            System.out.println("occurrence of '" + key + "' is  "+ charCounter.get(key));
                  }
          
              }
          
          }
          

          【讨论】:

            【解决方案9】:

            public void mapPractices() {

                Map<Character, Integer> map = new HashMap<>();
                String dataString = "!@#$%^&*()__)(*&^%$#@!@#$%^&*(*&^%$#@!@#$%^&*()(*&^%$#@!@#$%^&*()(*&^%$#@!@#$%^&*()(*&^%$#";
                for (int i = 0; i < dataString.length(); i++) {
            
                    char charAt = dataString.charAt(i);
            
                    if (map.containsKey(charAt)) {
                        int val = map.get(charAt);
                        map.put(charAt, val+1);
            
                    } else {
            
                        map.put(charAt, +1);
                    }
            
                }
                System.out.println("Characters ant the string=" + map);
            
            }
            

            【讨论】:

              【解决方案10】:

              lambda 单线
              在旧式解决方案中的错误修复后,这里有一个 lambda 中的替代解决方案,它做同样的事情:

              Map<Character,Long> counts =
              "an example string to work with".codePoints().boxed().collect(
                  groupingBy( t -> (char)(int)t, counting() ) );
              

              获取:{ =5, a=2, e=2, g=1, h=1, i=2, k=1, l=1, m=1, n=2, o=2, p=1, r=2, s=1, t=3, w=2, x=1}
              您可以获得特定字符的编号,例如。 't' 作者:
              counts.get( 't' )

              (出于病态的好奇心,我还编写了一个 lambda 解决方案,以了解我的解决方案有多慢,最好是来自具有 10 行解决方案的人。)

              【讨论】:

                猜你喜欢
                • 2022-10-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-23
                • 1970-01-01
                • 1970-01-01
                • 2020-07-23
                • 2020-04-19
                相关资源
                最近更新 更多