2015-05-01 50 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 –