2015-05-01 51 views
0

我應該要求用戶輸入一個字符串,我應該解析字符串並跟蹤字母表的數量。所以像,如果用戶輸入字符串「ABEE」 它顯示輸出:JAVA - 存儲字符串和字符串的數量

a: 1 
b: 1 
c: 0 
e: 2 

到目前爲止,我已經能夠得到字符串並解析它並保存元素到數組。而且我一次可以用for循環打印出每封信。現在我面臨的問題是,當它打印出字母以及短語中存在多少字母時,這些數字不匹配。例如,如果我輸入字母:「abccddee」 它打印出:

a: 1 
b: 1 
c: 1 
c: 0 
d: 0 
d: 0 
e: 0 
e: 0 

出於測試目的,我用我自己的字符串,而不是使用掃描儀。

import java.util.Scanner; 

public class CountLetters 
{ 

    public static void main(String[] args) 
    { 

     //create arrays 
     String[] upper = new String[25]; 
     String[] lowerChar = new String[25]; 
     int [] lowerCharNum = new int[25]; 

     Scanner input = new Scanner(System.in); 

     System.out.println("Please enter a phrase"); 

     //grab phrase from user 
     String phrase = "abccddee"; 

     //create array with the size of the phrase entered from user 
     String[] letters = new String[phrase.length()]; 
     System.out.println("letters length: " + letters.length); 

     //separate every letter in phrase and store it into array "letters" 
     letters = phrase.split(""); 

     for(int i=0; i<letters.length; i++) 
     { 
      lowerChar[i] = letters[i]; 
      switch(letters[i]) 
      { 
       case "a": 
        lowerCharNum[0] += 1; 
        break; 
       case "b": 
        lowerCharNum[1] += 1; 
        break; 
       case "c": 
        lowerCharNum[2] += 1; 
        break; 
       case "d": 
        lowerCharNum[3] += 1; 
        break; 
       case "e": 
        lowerCharNum[4] += 1; 
        break; 
       case "f": 
        lowerCharNum[5] += 1; 
        break; 
      }//end of switch 
      System.out.println(lowerChar[i] + ": " + lowerCharNum[i]); 
     } 
    }//end of main method 
}//end of class 
+0

你爲什麼要從'String phrase'創建一個單獨的'String'數組? –

+0

因爲分配我必須讓程序解析大寫字母和小寫字母,所以我讓字母數組來保存所有的字母數組,然後將它們分開到相應的upper和lowerChar數組中。 – rissandimo

+0

@rissandimo:請注意,您的方法不能很好地擴展。我建議你閱讀下面發佈的答案。 – Bhoot

回答

2

print語句必須 for循環之外。

System.out.println(lowerChar[i] + ": " + lowerCharNum[i]); 

更新: 你需要首先分析整個字符串,然後開始打印。

import java.io.*; 
import java.util.*; 
class CountLetters { 

    public static void main(String[] args) 
    { 
int i; 
      //create arrays 
     String[] upper = new String[25]; 
     String[] lowerChar = new String[25]; 
     int [] lowerCharNum = new int[25]; 


     Scanner input = new Scanner(System.in); 

     System.out.println("Please enter a phrase"); 

     //grab phrase from user 
     String phrase = "abccddee"; 

     //create array with the size of the phrase entered from user 
     String[] letters = new String[phrase.length()]; 
     System.out.println("letters length: " + letters.length); 

     //seperate every letter in phrase and store it into array "letters" 
     letters = phrase.split(""); 


     for(i=0; i<letters.length; i++) 
     { 
      lowerChar[i] = letters[i]; 
     switch(letters[i]) 
     { 
     case "a": 
      lowerCharNum[0] += 1; 
      break; 
     case "b": 
      lowerCharNum[1] += 1; 
      break; 
     case "c": 
      lowerCharNum[2] += 1; 
      break; 
     case "d": 
      lowerCharNum[3] += 1; 
      break; 
     case "e": 
      lowerCharNum[4] += 1; 
      break; 
     case "f": 
      lowerCharNum[5] += 1; 
      break; 
     }//end of switch 



     } 

for(i=0;i<5;i++) 
System.out.println(lowerChar[i] + ": " + lowerCharNum[i]); 



    }//end of main method 


}//end of class 
+0

我把打印語句移到了for循環之外,它說null:0 – rissandimo

+0

我在ops代碼中沒有看到任何while循環? –

+0

此答案已被標記爲低質量答案。請提供一些解釋。你一直說while while循環** op代碼中的while循環在哪裏?** –

3

您正在for循環內打印。您應該在該循環外打印頻率。

您使用的方法不可縮放。由於該短語只包含大寫和小寫英文字母,因此您必須在交換機中編寫52個案例語句。

更好的方法來做同樣的事情就是使用ASCII編碼來達到你的目的。您可以在以下的說法:

int frequency[] = new int[128]; 
for (int i = 0; i < phrase.length(); i++) { 
    frequency[(int) phrase.charAt(i)]++; 
} 

在這種方法中frequency陣列用於計算的前128個ASCII字符出現在phrase字符串。操作(int) phrase.charAt(i)只是將字符轉換爲相應的ASCII碼,並將該字符的計數器增加1.在處理結束時,frequency數組將包含給定的phrase字符串中前128個ASCII字符的出現次數。只需打印此頻率即可獲得所需的輸出。

+0

不鼓勵代碼回答。請添加一些解釋。 –

+0

@KickButtowski:根據您的建議添加解釋。 – Bhoot

+0

我給你投票,但如果你能擺脫代碼,它會很棒。只要你能給出一個示例代碼來幫助操作者理清問題就好多了。 –

1

您的數組解決方案有點複雜。通過使用Map,我們可以直接將碰到的字符與遇到的次數關聯起來,這樣可以非常直接地增加計數器並輸出計數器,而無需在不同陣列中查找索引。

import java.util.HashMap; 
import java.util.Map; 
import java.util.Scanner; 

public class CountLetters 
{ 

    public static void main(String[] args) 
    { 

     Scanner input = new Scanner(System.in); 

     System.out.println("Please enter a phrase"); 

     //grab phrase from user 
     String phrase = "abccddee"; 

     //create array with the phrase entered from user 
     char[] letters = phrase.toCharArray(); 
     System.out.println("letters length: " + letters.length); 

     // Map to keep track of all encountered characters and the 
     // number of times we've encountered them 
     Map<Character, Integer> characterCounts = new HashMap<>(); 
     for(int i=0; i<letters.length; i++) 
     { 
      Character character = letters[i]; 
      if(characterCounts.containsKey(character)) 
      { 
       // We've encountered this character before, increase the counter 
       characterCounts.put(character, characterCounts.get(character) + 1); 
      } 
      else 
      { 
       // This is the first time we encounter this character 
       characterCounts.put(lowerChar, 1); 
      } 
     } 

     // Iterate over all character-counter pairs and print them 
     for(Map.Entry<Character, Integer> entry : characterCounts.entrySet()) 
     { 
      System.out.println(entry.getKey() + ": " + entry.getValue()); 
     } 
    }//end of main method 
}//end of class 
+0

此答案已被標記爲低質量答案。請提供一些解釋。 –

+1

我只是Java編程的初學者,這是我第一堂課。所以我還有很多東西要學。感謝您的建議。 – rissandimo

+1

你能否請你的答案給出解釋爲什麼這段代碼回答這個問題?僅限代碼答案[不鼓勵](http://meta.stackexchange.com/questions/148272),因爲他們沒有教導解決方案。 – DavidPostill

3

,而不是簡單的數組工作,就可以用java的CollectionHashMap工作。

隨着HashMap主要工作去與周圍的for循環,將檢查CharacterHashMap已經存在,如果它是那麼我們將得到與Character關聯的值,將增加1與現有的值,如果Character不存在,那麼我們將把Character放入HashMap,並且將存儲與相關字符相關的初始計數1。

 HashMap<Character, Integer> lettersCount = new HashMap<>(); 
     String phrase = "abccddee"; 
     int length = phrase.length(); 
     int count = 1; 
     for (int i = 0; i < length; i++) { 
     int integer = 0; 
     char charAt = input.charAt(i); 
     if (!lettersCount.containsKey(charAt)) { 
      lettersCount.put(charAt, 0); 
     } 
     integer = lettersCount.get(charAt); 
     integer = initialCount + integer; 
     lettersCount.put(charAt, integer); 
    } 
    System.out.println(lettersCount); 

您正在使用您將需要並初始化數組首先在申報的時候,這將創建一個額外的內存空間,如果沒有被遇到的所有26個字母,這將是浪費,按照你的代碼已經提供在這個問題你分配3個陣列,所以它會佔用更多的內存,所以這個解決方案將只需要一個HashMapHashMap將分配內存根據鍵和值插入HashMap)和for循環,這將只計算出現的Charater,並在程序中再次使用它將會更容易。

+0

此答案已被標記爲低質量答案。請提供一些解釋。 –

+0

旁邊是一個新手,你建議不幫助操作。 –

+0

感謝您的建議。我已經添加了更詳細的解釋來回答。 @KickButtowski –