如何统计string中的字符的频率?

我需要写一些循环来计算string中每个字母的频率。
例如:“aasjjikkk”会计算2'a',1's',2'j',1'i',3'k'。 最终像这样的id结束在地图中,字符作为关键字,数字作为值。 任何好主意如何做到这一点?

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

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(new Character(c)); if(val != null){ map.put(c, new Integer(val + 1)); }else{ map.put(c,1); } } 

最后,你会得到你遇到的所有angular色的数量,你可以从中提取他们的频率。

另外,您可以使用Bozho的Multiset解决scheme,并计算总发生次数。

你可以使用Multiset ( 番石榴 )。 它会给你每个对象的计数。 例如:

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

然后为每个字符你可以调用chars.count('a') ,它返回的出现次数

这是另一个解决办法,它可能是狡猾的。

 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); } 

那么,有两种方法可以想到,这取决于你的喜好:

  1. 按字符sorting数组。 然后,计算每个字符变得微不足道。 但是你必须首先制作一个数组的副本。

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

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

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

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

简单的方法是:

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

我们使用for-each来遍历每个字符。 如果key存在或者返回(默认)第二个参数,那么frequencies.getOrDefault()将获得值。

这是一个解决scheme:

定义你自己的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; } 

您可以使用Eclipse集合中的CharAdapterCharBag ,并避免装箱到CharacterInteger

 CharBag bag = CharAdapter.adapt("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集合的提交者。

如果这不需要超快,只需创build一个整数数组,每个字母一个整数(只有字母,所以2 * 26整数或任何可能的二进制数据?)。 通过string一个字符一次,得到负责整数的索引(例如,如果你只有字母字符,你可以有'A'在索引0并通过减去任何'A'到'Z'索引通过“A”就是您如何获得合理快速指数的一个例子),并增加该指数的价值。

有很多微观优化可以使其更快(如果有必要的话)。

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

 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; } 

这与xunil154的答案类似,区别在于一个string被作为一个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); } 
 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()); } } } 
 NOTE, this will also count the frequencies of empty spaces 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 input=sc.nextLine(); 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(); } } } 
 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++; } } } 
 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); } } 

input = aaaajjjgggtttssvvkkllaaiiikk

输出 = a6s2t3v2g3i3j3k4l2

使用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; } 

由于没有Java 8的解决scheme,想到张贴一个。 而且,这个解决scheme比这里提到的其他一些解决scheme更加整洁,易读和简洁。

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