【问题标题】:How to count frequency of characters in a string?如何计算字符串中字符的频率?
【发布时间】:2011-10-06 10:56:42
【问题描述】:

我需要编写某种循环来计算字符串中每个字母的频率。
例如:“aasjjikkk”将计算 2 个“a”、1 个“s”、2 个“j”、1 个“i”、3 个“k”。最终像这样的 id 最终以字符为键,计数为值。任何好主意如何做到这一点?

【问题讨论】:

    标签: java string key-value


    【解决方案1】:

    您可以使用 java Map 并将 char 映射到 int。然后,您可以遍历字符串中的字符并检查它们是否已添加到地图中,如果有,您可以增加其值。

    例如:

    HashMap<Character, Integer> map = new HashMap<Character, Integer>();
    String s = "aasjjikkk";
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        Integer val = map.get(c);
        if (val != null) {
            map.put(c, new Integer(val + 1));
        }
        else {
           map.put(c, 1);
       }
    }
    

    最后,您将统计您遇到的所有字符,并从中提取它们的频率。

    或者,您可以使用 Bozho 的解决方案,即使用 Multiset 并计算总出现次数。

    【讨论】:

    • 哦,但你不能实例化地图,它的抽象,仅供参考。
    • 我的错,应该是HashMap,而不是Map。谢谢你的收获
    • 也应该是
    • HashMap
    • 能否解释一下步骤:if(val != null) { ... }
    【解决方案2】:

    一个简洁的方法是:

    Map<Character,Integer> frequencies = new HashMap<>();
    for (char ch : input.toCharArray()) 
       frequencies.put(ch, frequencies.getOrDefault(ch, 0) + 1);
    

    我们使用 for-each 循环遍历每个字符。 frequencies.getOrDefault() 如果 key 存在或返回(默认)其第二个参数,则获取值。

    【讨论】:

      【解决方案3】:

      从 JDK-8 开始使用流 API:

      Map<Character, Long> frequency =
                  str.chars()
                     .mapToObj(c -> (char)c)
                     .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
      

      或者如果您希望键为整数:

      Map<Character, Integer> frequency =
                  str.chars()
                     .mapToObj(c -> (char)c)
                     .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(c -> 1)));
      

      另一种变体:

      Map<Character, Integer> frequency = 
                  str.chars()
                     .mapToObj(c -> (char)c)
                     .collect(Collectors.toMap(Function.identity(), c -> 1, Math::addExact));
      

      【讨论】:

        【解决方案4】:

        您可以使用Multiset(来自guava)。它会给你每个对象的计数。例如:

        Multiset<Character> chars = HashMultiset.create();
        for (int i = 0; i < string.length(); i++) {
            chars.add(string.charAt(i));
        }
        

        然后对于每个字符,您可以调用 chars.count('a') 并返回出现次数

        【讨论】:

        • 我确实需要标准库中的一些东西。
        【解决方案5】:

        这是另一种解决方案,尽管它可能很狡猾。

        public char getNumChar(String s) {
            char[] c = s.toCharArray();
            String alphabet = "abcdefghijklmnopqrstuvwxyz";
            int[] countArray = new int[26];
            for (char x : c) {
                for (int i = 0; i < alphabet.length(); i++) {
                    if (alphabet.charAt(i) == x) {
                        countArray[i]++;
                    }
                }
            }
        
            java.util.HashMap<Integer, Character> countList = new java.util.HashMap<Integer, Character>();
        
            for (int i = 0; i < 26; i++) {
                countList.put(countArray[i], alphabet.charAt(i));
            }
            java.util.Arrays.sort(countArray);
            int max = countArray[25];
            return countList.get(max);
        }
        

        【讨论】:

          【解决方案6】:

          嗯,我想到了两种方法,这取决于你的喜好:

          1. 按字符对数组进行排序。然后,计算每个字符变得微不足道。但是您必须先复制该数组。

          2. 创建另一个大小为 26 的整数数组(比如 freq),str 是字符数组。

            for(int i = 0; i &lt; str.length; i ++)

            freq[str[i] - 'a'] ++; //Assuming all characters are in lower case

          所以 'a' 的数量将存储在 freq[0] 而 'z' 的数量将存储在 freq[25]

          【讨论】:

            【解决方案7】:

            由于没有 Java 8 解决方案,所以想发布一个。此外,这个解决方案比这里提到的其他一些解决方案更整洁、可读和简洁。

            String string = "aasjjikkk";
            
            Map<Character, Long> characterFrequency = string.chars()  // creates an IntStream
                .mapToObj(c -> (char) c) // converts the IntStream to Stream<Character>
                .collect(Collectors.groupingBy(c -> c, Collectors.counting())); // creates a
                                                                                // Map<Character, Long> 
                                                                                // where the Long is
                                                                                // the frequency
            

            【讨论】:

              【解决方案8】:

              这里有一个解决方案:

              定义你自己的Pair:

              public class Pair
              {
                  private char letter;
                  private int count;
                  public Pair(char letter, int count)
                  {
                      this.letter = letter;
                      this.count= count;
                  }
                  public char getLetter(){return key;}
                  public int getCount(){return count;}
              }
              

              那么你可以这样做:

              public static Pair countCharFreq(String s)
              {
                  String temp = s;
                  java.util.List<Pair> list = new java.util.ArrayList<Pair>();
                  while(temp.length() != 0)
                  {
                      list.add(new Pair(temp.charAt(0), countOccurrences(temp, temp.charAt(0))));
                      temp.replaceAll("[" + temp.charAt(0) +"]","");
                  }
              }
              
              public static int countOccurrences(String s, char c)
              {
                  int count = 0;
                  for(int i = 0; i < s.length(); i++)
                  {
                      if(s.charAt(i) == c) count++;
                  }
                  return count;
              }
              

              【讨论】:

                【解决方案9】:
                String s = "aaaabbbbcccddddd";
                Map<Character, Integer> map = new HashMap<>();
                

                在Java8中使用一行

                s.chars().forEach(e->map.put((char)e, map.getOrDefault((char)e, 0) + 1));
                

                【讨论】:

                  【解决方案10】:

                  您可以使用CharAdapter 中的CharAdapterCharBag,并避免与CharacterInteger 绑定。

                  CharBag bag = Strings.asChars("aasjjikkk").toBag();
                  
                  Assert.assertEquals(2, bag.occurrencesOf('a'));
                  Assert.assertEquals(1, bag.occurrencesOf('s'));
                  Assert.assertEquals(2, bag.occurrencesOf('j'));
                  Assert.assertEquals(1, bag.occurrencesOf('i'));
                  Assert.assertEquals(3, bag.occurrencesOf('k'));
                  

                  注意:我是 Eclipse Collections 的提交者。

                  【讨论】:

                    【解决方案11】:

                    还有一个选项,看起来很不错。 从 java 8 开始有新方法 merge java doc

                      public static void main(String[] args) {
                        String s = "aaabbbcca";
                    
                        Map<Character, Integer> freqMap = new HashMap<>();
                        for (int i = 0; i < s.length(); i++) {
                            Character c = s.charAt(i);
                            freqMap.merge(c, 1, (a, b) -> a + b);
                        }
                        freqMap.forEach((k, v) -> System.out.println(k + " and " + v));
                    }
                    

                    甚至使用 ForEach 更清洁

                           for (Character c : s.toCharArray()) {
                                freqMapSecond.merge(c, 1, Integer::sum);
                               }
                    

                    【讨论】:

                      【解决方案12】:
                      package com.rishi.zava;
                      
                      import java.util.HashMap;
                      import java.util.Map;
                      import java.util.Map.Entry;
                      
                      public class ZipString {
                          public static void main(String arg[]) {
                              String input = "aaaajjjgggtttssvvkkllaaiiikk";
                              int len = input.length();
                              Map<Character, Integer> zip = new HashMap<Character, Integer>();
                              for (int j = 0; len > j; j++) {
                                  int count = 0;
                                  for (int i = 0; len > i; i++) {
                                      if (input.charAt(j) == input.charAt(i)) {
                                          count++;
                                      }
                                  }
                                  zip.put(input.charAt(j), count);
                              }
                              StringBuffer myValue = new StringBuffer();
                              String myMapKeyValue = "";
                              for (Entry<Character, Integer> entry : zip.entrySet()) {
                                  myMapKeyValue = Character.toString(entry.getKey()).concat(
                                          Integer.toString(entry.getValue()));
                                  myValue.append(myMapKeyValue);
                              }
                              System.out.println(myValue);
                          }
                      }
                      

                      输入 = aaaajjjgggtttssvvkkllaaiiikk

                      输出 = a6s2t3v2g3i3j3k4l2

                      【讨论】:

                        【解决方案13】:

                        如果这不需要超快,只需创建一个整数数组,每个字母一个整数(只有字母所以 2*26 整数?或任何可能的二进制数据?)。一次遍历一个字符的字符串,获取负责整数的索引(例如,如果你只有字母字符,你可以让 'A' 位于索引 0 并通过减去任何 'A' 到 'Z' 来获得该索引'A' 只是作为如何获得合理快速索引的示例)并增加该索引中的值。

                        有各种微优化可以加快速度(如有必要)。

                        【讨论】:

                          【解决方案14】:

                          您可以使用哈希表,每个字符作为键,总计数成为值。

                          Hashtable<Character,Integer> table = new Hashtable<Character,Integer>();
                          String str = "aasjjikkk";
                          for( c in str ) {
                              if( table.get(c) == null )
                                  table.put(c,1);
                              else
                                  table.put(c,table.get(c) + 1);
                          }
                          
                          for( elem in table ) {
                              println "elem:" + elem;
                          }
                          

                          【讨论】:

                            【解决方案15】:

                            这类似于xunil154的回答,只是将字符串做成char数组,并使用链接的hashmap来维护字符的插入顺序。

                            String text = "aasjjikkk";
                            char[] charArray = text.toCharArray();
                            Map<Character, Integer> freqList = new LinkedHashMap<Character, Integer>();
                            
                                    for(char key : charArray) {
                                        if(freqList.containsKey(key)) {
                                           freqList.put(key, freqList.get(key) + 1);
                                        } else
                                            freqList.put(key, 1);
                                    }
                            

                            【讨论】:

                              【解决方案16】:
                              import java.util.*;
                              class Charfrequency
                              {
                               public static void main(String a[]){
                              
                                      Scanner sc=new Scanner(System.in);
                                      System.out.println("Enter Your String :");
                                      String s1=sc.nextLine();
                                      int count,j=1;
                                      char var='a';
                                      char ch[]=s1.toCharArray();
                                      while(j<=26)
                                      {
                                         count=0;
                                              for(int i=0; i<s1.length(); i++)
                                              {
                                                  if(ch[i]==var || ch[i]==var-32)
                                                  {
                                                      count++;
                                                  }
                                              }
                                              if(count>0){
                                              System.out.println("Frequency of "+var+" is "+count);
                                              }
                                              var++;
                                              j++;
                                      }
                               }
                              }
                              

                              【讨论】:

                                【解决方案17】:

                                使用 HashMap 的可能的短代码。 (没有强行保存)

                                private static Map<Character, Integer> findCharacterFrequency(String str) {
                                
                                        Map<Character, Integer> map = new HashMap<>();
                                
                                        for (char ch : str.toCharArray()) {
                                            /* Using getOrDefault(), since Java1.8 */
                                            map.put(ch, map.getOrDefault(ch, 0) + 1);
                                        }
                                        return map;
                                    }
                                

                                【讨论】:

                                  【解决方案18】:

                                  请尝试下面给出的代码,希望对您有所帮助,

                                  import java.util.Scanner;
                                  
                                  class String55 {
                                      public static int frequency(String s1,String s2)
                                      {
                                  
                                          int count=0;
                                          char ch[]=s1.toCharArray();
                                          char ch1[]=s2.toCharArray();
                                          for (int i=0;i<ch.length-1; i++)
                                          {
                                  
                                  
                                  
                                                  int k=i;
                                  
                                                  int j1=i+1;
                                                  int j=0;
                                                  int j11=j;
                                                  int j2=j+1;
                                                  {
                                                      while(k<ch.length && j11<ch1.length && ch[k]==ch1[j11])
                                                      {
                                                      k++;
                                                      j11++;
                                  
                                                      }
                                  
                                  
                                                  int l=k+j1;
                                                  int m=j11+j2;
                                                  if( l== m)
                                                  {
                                                      count=1;
                                                      count++;
                                                  }
                                  
                                  
                                  
                                  
                                  
                                          }
                                          }
                                          return count;
                                  
                                  
                                      }
                                      public static void main (String[] args) {
                                          Scanner sc=new Scanner(System.in);
                                          System.out.println("enter the pattern");
                                          String s1=sc.next();
                                              System.out.println("enter the String");
                                              String s2=sc.next();
                                              int res=frequency(s1, s2);
                                              System.out.println("FREQUENCY==" +res);
                                  
                                      }
                                  }
                                  

                                  样本输出: 输入模式 人 输入字符串 迪曼曼 频率==2

                                  谢谢。祝你编码愉快。

                                  【讨论】:

                                    【解决方案19】:
                                    package com.dipu.string;
                                    
                                    import java.util.HashMap;
                                    import java.util.Map;
                                    
                                    public class RepetativeCharInString {
                                        public static void main(String[] args) {
                                            String data = "aaabbbcccdddffffrss";
                                            char[] charArray = data.toCharArray();
                                            Map<Character, Integer> map = new HashMap<>();
                                            for (char c : charArray) {
                                                if (map.containsKey(c)) {
                                                    map.put(c, map.get(c) + 1);
                                                } else {
                                                    map.put(c, 1);
                                                }
                                            }
                                            System.out.println(map);
                                    
                                        }
                                    }
                                    

                                    【讨论】:

                                    • 请记住始终添加代码说明。
                                    【解决方案20】:
                                    *import java.util.ArrayList;
                                    import java.util.Collections;
                                    
                                    public class Freq {
                                    
                                        public static void main(String[] args) {
                                            // TODO Auto-generated method stub
                                            String temp="zsaaqaaaaaaaabbbbbcc";
                                        List<String> temp1= new ArrayList<String> ();
                                        ArrayList<Integer>freq=new ArrayList<Integer>();
                                        for(int i=0;i<temp.length()-1;i++)
                                        {       
                                            temp1.add(Character.toString(temp.charAt(i)));      
                                        }
                                        Set<String> uniqset=new HashSet<String>(temp1);
                                        for(String s:uniqset)
                                        {
                                            freq.add(Collections.frequency(temp1, s));
                                            System.out.println(s+" -->>"+Collections.frequency(temp1, s));
                                        }
                                        }
                                    
                                    }
                                               ------Output-------
                                           a -->>10
                                           b -->>5
                                           c -->>1
                                           q -->>1
                                           s -->>1
                                           z -->>1
                                    

                                    使用集合频率法统计char*的频率

                                    【讨论】:

                                      【解决方案21】:

                                      呃。你不认为这是最简单的解决方案吗?

                                          char inputChar = '|';
                                          int freq = "|fd|fdfd|f dfd|fd".replaceAll("[^" + inputChar +"]", "").length();
                                          System.out.println("freq " + freq);
                                      

                                      【讨论】:

                                        【解决方案22】:

                                        我们可以为此使用 Collections 类的频率方法。 将字符串拆分为字符串数组。使用 HashSet 去除重复项并使用 Collections 的频率方法检查 HashSet 中每个对象的频率

                                        void usingCollections(){
                                        
                                          String input = "cuttack";
                                        
                                          String [] stringArray = input.split("");
                                        
                                          Set<String> s = new HashSet(Arrays.asList(stringArray));
                                        
                                          for(String abc : s){
                                        
                                            System.out.println (abc + ":"+Collections.frequency(Arrays.asList(stringArray),abc));
                                        
                                          }
                                        }
                                        

                                        【讨论】:

                                        • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
                                        【解决方案23】:

                                        这是计算字符串中字符频率的更有效方法

                                        public class demo {
                                            public static void main(String[] args) {
                                                String s = "babdcwertyuiuygf";
                                                Map<Character, Integer> map = new TreeMap<>();
                                                s.chars().forEach(e->map.put((char)e, map.getOrDefault((char)e, 0) + 1));
                                                StringBuffer myValue = new StringBuffer();
                                                String myMapKeyValue = "";
                                                for (Map.Entry<Character, Integer> entry : map.entrySet()) {
                                                    myMapKeyValue = Character.toString(entry.getKey()).concat(
                                                        Integer.toString(entry.getValue()));
                                                    myValue.append(myMapKeyValue);
                                                }
                                                System.out.println(myValue);
                                            }
                                        }
                                        

                                        【讨论】:

                                          【解决方案24】:

                                          使用地图合并方法的另一种方式

                                             Map<Character, Integer> map = new HashMap<>();
                                             String s = "aasjjikkk";
                                              for (int i = 0; i < s.length(); i++) {
                                                  map.merge(s.charAt(i), 1, (l, r) -> l + r);
                                          

                                          【讨论】:

                                            【解决方案25】:
                                            import java.util.HashMap;
                                            import java.util.Iterator;
                                            import java.util.Map;
                                            import java.util.Map.Entry;
                                            import java.util.Scanner;
                                            
                                            
                                            public class FrequenceyOfCharacters {
                                            
                                                public static void main(String[] args) {
                                                    System.out.println("Please enter the string to count each character frequencey: ");
                                                    Scanner sc=new  Scanner(System.in);
                                                    String s =sc.nextLine();
                                                    String input = s.replaceAll("\\s",""); // To remove space.
                                                    frequenceyCount(input);
                                                    
                                                    
                                                }
                                            
                                                private static void frequenceyCount(String input) {
                                                    
                                                    Map<Character,Integer> hashCount=new HashMap<>();
                                                    Character c;
                                                    for(int i=0; i<input.length();i++)
                                                    {
                                                       c =input.charAt(i);
                                                       if(hashCount.get(c)!=null){
                                                           hashCount.put(c, hashCount.get(c)+1);
                                                       }else{
                                                           hashCount.put(c, 1);
                                                       }
                                                    }
                                                    Iterator it = hashCount.entrySet().iterator();
                                                    System.out.println("char : frequency");
                                                    while (it.hasNext()) {
                                                        Map.Entry pairs = (Map.Entry)it.next();
                                                        System.out.println(pairs.getKey() + " : " + pairs.getValue());
                                                        it.remove(); 
                                                    }
                                                    
                                                }
                                            
                                            }
                                            

                                            【讨论】:

                                              【解决方案26】:
                                              import java.io.FileInputStream;
                                              import java.util.HashSet;
                                              import java.util.Iterator;
                                              public class CountFrequencyOfCharater {
                                              public static void main(String args[]) throws Exception
                                              {
                                                  HashSet hs=new HashSet();
                                                  String str="hey how are you?";
                                                  char arr[]=new char[str.length()];
                                                  for(int i=0;i<str.length();i++)
                                                  {
                                                      arr[i]=str.charAt(i);
                                                  }
                                                  for(int j=0;j<str.length();j++)
                                                  {
                                                      int c=0;
                                                      for(int k=0;k<str.length();k++)
                                                      {
                                                          if(arr[j]==arr[k])
                                                          c++;
                                                      }
                                                      hs.add(arr[j]+"="+c+",");
                                                  }
                                                      Iterator it=hs.iterator();
                                                      while(it.hasNext())
                                                      {
                                                           System.out.print(it.next());
                                                      }
                                                }
                                              }
                                              

                                              【讨论】:

                                              • 请添加一些说明或解释,说明为什么它有效,而不仅仅是提供代码。这将使它对将来看到它的人更有意义。
                                              【解决方案27】:

                                              #来自C语言

                                               #include<stdio.h>`
                                               #include <string.h>`
                                                int main()
                                              {
                                                  char s[1000];  
                                                  int  i,j,k,count=0,n;
                                                  printf("Enter  the string : ");
                                                  gets(s);
                                                  for(j=0;s[j];j++);
                                                  n=j; 
                                                  printf(" frequency count character in string:\n");
                                                  for(i=0;i<n;i++)  
                                                  {
                                                      count=1;
                                                      if(s[i])
                                                      {
                                                      
                                                        for(j=i+1;j<n;j++)  
                                                        {   
                                                          
                                                          if(s[i]==s[j])
                                                          {
                                                               count++;
                                                               s[j]='\0';
                                                          }
                                                        }  
                                                        printf(" '%c' = %d \n",s[i],count);
                                                     }
                                                  } 
                                                  return 0;
                                              }
                                              

                                              【讨论】:

                                              • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
                                              • 只是好奇,你为什么要用不同的编程语言回答标记为 java 的问题?
                                              猜你喜欢
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2016-05-18
                                              • 2017-04-19
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2019-08-07
                                              • 1970-01-01
                                              相关资源
                                              最近更新 更多