如何统计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); }
那么,有两种方法可以想到,这取决于你的喜好:
-
按字符sorting数组。 然后,计算每个字符变得微不足道。 但是你必须首先制作一个数组的副本。
-
创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集合中的CharAdapter
和CharBag
,并避免装箱到Character
和Integer
。
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