2010-05-30 119 views
3

如何在Java中获取字符串中出现的所有字符的列表,其中包含多少个字符?假设我们有一个字符串“我现在真的很忙”,所以我应该得到:从字符串中获取所有字符及其编号

i-2,a-2,r-2,m-1等等。

+1

定义“字符”。它是一个32位的Unicode代码点吗?它可以有所作为。 – 2010-05-31 00:08:30

+0

这可以很好地作为一个非常简单的代码kata :) – 2010-05-31 01:32:03

回答

4

只是有一个每个字符和他们的计数的映射。您可以使用String#toCharArray()获得String的字符数组,并使用enhanced for loop循环访问它。在每次迭代中,从映射中获取计数,如果没有,则设置它,然后用1递增并放回地图。非常简单。

这里有一个基本的开球例如:

String string = "I am really busy right now"; 
Map<Character, Integer> characterCounts = new HashMap<Character, Integer>(); 
for (char character : string.toCharArray()) { 
    Integer characterCount = characterCounts.get(character); 
    if (characterCount == null) { 
     characterCount = 0; 
    } 
    characterCounts.put(character, characterCount + 1); 
} 

要了解更多有关地图,检查Sun tutorial on the subject


你的评论,这是“一个项目”,但但它是一个典型的家庭作业的问题,因为它是非常基本的和盖在一个体面的Java书/教程的第一章。如果你是Java新手,我建议你通过Sun Trails Covering the Basics

+0

一个字符不再是一个字符,不幸的是。 – 2010-05-31 00:36:04

0

作业吗?如果不知道,我会尽力回答。

您的问题背后的逻辑是

  • 去trought列表中的一个角色在时间
  • 计数字符:因为可能的字符(不包括Unicode)的仅仅是256,你可以有256 int数组并在那里计数:通过这种方式,您不需要搜索正确的计数器,只需增加正确的索引即可。
+0

不,我只需要它为我的项目 – terence6 2010-05-31 00:00:53

0

我不知道您的具体需求,但它似乎要算不管发生的情况下,也可能忽略的字符,如空格等,所以,你可能想是这样的:

String initial = "I am really busy right now"; 

String cleaned = initial.replaceAll("\\s", "") //remove all whitespace characters 
     .toLowerCase(); // lower all characters 

Map<Character, Integer> map = new HashMap<Character, Integer>(); 
for (char character : cleaned.toCharArray()) { 
    Integer count = map.get(character); 
    count = (count!=null) ? count + 1 : 1; 
    map.put(character, count); 
} 

for (Map.Entry<Character, Integer> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + " : " + entry.getValue()); 
} 

调整正则表达式以满足您的确切要求(跳过标点符号等)。

相关问题