这个节目怎么样?

时间:2011-11-14 04:30:03

标签: java arrays string sorting

说明:

  

编写一个程序,读取一行结束的文本   有一段时期,作为哨兵价值。显示所有   文本中出现的字母,每行一个字母和字母   顺序,以及每个字母在文本中出现的次数。   使用长度为26的基本类型int数组,以便元素位于   index 0包含a的个数。和索引1包含b s等的数量。

package alphabetize;

 import java.util.*;

 public class Alphabetize 
 {

private static void number(String s) 
{
    int[] array = new int[26];
    s = s.toUpperCase();
    System.out.println(s);

    for (int i = 0; i < s.length(); ++i) 
    {
        if (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z') 
        {
            ++array[s.charAt(i) - 'A'];
        }
    }

    for (int i = 0; i < 26; ++i) 
    {
        System.out.println("|" + (char) ('A' + i) + "|" + array[i] + "|");
    }
}

public static void main(String[] args) 
{
    Scanner keyboard = new Scanner(System.in);
    String aString = ".";
    while (true) 
    {
        System.out.println("Please enter sentence with a period to end");
        aString = keyboard.nextLine();
        if (".".equals(aString)) 
        {
            System.exit(0);
        }
        number(aString);
    }
}
}

仍有问题与期间的事情..它似乎没有像我做的那样工作。

4 个答案:

答案 0 :(得分:2)

考虑到这是一个功课,说明非常具体,你应该逐个字符地阅读文本,而不是使用内置函数

如果您的文本文件类似于

abcabca.

输出应该是出现三次,b出现两次等等。

所以你的算法应该是

  1. 阅读下一个字符
  2. 如果char是句号goto 5
  3. 如果char是空格goto 1。
  4. 如果char在&lt; - &gt;之间。 ž。更新arr [0..25]中的计数器并转到1
  5. 输出arr [0..25]每行一个

答案 1 :(得分:1)

是否要求此作业是用Java完成的? “sendinal character”的整个想法,而不仅仅是使用行终结符是非常奇怪的。

无论如何,您可以通过设置Scanner的分隔符来实现您想要的行为:

keyboard.useDelimiter("\\.");

至于循环,这是一个很大的暗示:

int[] counts;
counts[chars[0] - 'a'] = counts[chars[0] - 'a'] + 1;

或只是

counts[chars[0] - 'a']++;

我会让你把它包含在循环中。

修改

如果您 正在寻找一次性输入,我建议您使用InputStreamReader代替Scanner作为输入。这是一个基本的骨架:

Reader reader = new InputStreamReader(System.in);
while (true) {
    int nextInput = reader.read();

    if (nextInput == -1) {
       System.out.println("End of input reached without sentinal character");
       break;
    } 
    char nextChar = (char) nextInput;
    //deal with next character

}

仍然,read()通常会阻塞,直到达到输入结束( CTRL - D CTRL - <来自大多数控制台的kbd> Z 或发送新行。因此,在输入“。”后,你仍然需要做一些事情,因此使用的字符数量有限。

答案 2 :(得分:0)

  1. 您必须检查句点是否在最后。所以最后一个字符应该是'。'。
  2. 然后在最后'。'之前取字符串的长度。
  3. 对于计数部分,创建一个像你正在做的数组: int [] name = new int [26] 其中每个从0,25开始的索引对应于'a'到'z'。
  4. 现在你把字符串字符放在一个循环中,并且必须检查那个字符是什么样的:

    if its a 'a' : increase the value at index 0 by 1. 
    if its a 'd' : increase the value at index 3 by 1. 
    
    明智的。

    稍后用a,z显示整个数组以及0到25之间的索引。

    建议:如果不需要使用数组,并且您可以使用任何其他数据结构,则可以非常轻松地在 HashMap 中实现相同的结构。通过保持'a','z'作为键并计为相应的值。然后检索和显示值也会更容易。

答案 3 :(得分:0)

您需要一个int数组(例如int[] counts = new int[26];)读取输入行后,在循环中逐个字符地检查它。如果字符不是句点,则递增计数数组的相应元素。 (如果字符为a,则增加counts[0];如果为b,则增加counts[1];等等。提示:您可以从字符中减去a获得适当的索引。)当你找到一个句点时,退出循环并打印结果(可能使用第二个循环)。