【问题标题】:How is this program coming along?这个项目进展如何?
【发布时间】:2011-12-28 09:01:43
【问题描述】:

说明:

编写一个程序来读取一行结束的文本 带有句点,用作哨兵值。显示所有 文本中出现的字母,每行一个,按字母顺序排列 顺序,以及每个字母在文本中出现的次数。 使用长度为 26 的基本类型 int 的数组,以便在 索引 0 包含 as 的数量。并且索引 1 包含 bs 等的数量。

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);
    }
}
}

月经问题仍然存在..它似乎不像我那样工作。

【问题讨论】:

    标签: java arrays string sorting


    【解决方案1】:

    考虑到这是一个家庭作业并且说明非常具体,您应该逐个字符地阅读文本,而不是使用内置函数

    如果您的文本文件类似于

    abcabca.
    

    输出应该是 a 出现 3 次,b 出现 2 次等等。

    所以你的算法应该是这样的

    1. 读取下一个字符
    2. 如果 char 是句点转到 5
    3. 如果 char 是空格,则转到 1。
    4. 如果 char 在 z 之间。更新 arr[0..25] 中的计数器并转到 1
    5. 输出 arr[0..25] 每行一个

    【讨论】:

    • 不应该是 [0..25] 而不是 [0..26]?
    【解决方案2】:

    是否强制要求使用 Java 完成此作业?使用“前哨字符”而不是仅仅使用行终止符的整个想法非常奇怪。

    无论如何,你可以通过设置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-DCTRL- Z 来自大多数控制台)或发送新行。因此,标记字符的用途有限,因为您在输入“.”后仍然需要做一些事情。

    【讨论】:

    • 嗯,奇怪。 Java 不太支持来自控制台的逐个字符输入。
    【解决方案3】:
    1. 您必须检查句末是否存在。所以最后一个字符应该是'.'。
    2. 然后取最后一个'.'之前的字符串长度。
    3. 对于计数部分,创建一个数组,就像你正在做的那样: 整数 [] 名称 = 新整数 [26] 其中从 0、25 开始的每个索引对应于 'a' 到 'z'。

    现在您将字符串字符放入一个循环中,并且必须检查该字符是什么样的:

    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'作为键并将计数作为相应的值。然后检索和显示值也会更容易。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多