2010-05-30 80 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()); 
} 

調整正則表達式以滿足您的確切要求(跳過標點符號等)。