Как продвигается эта программа? - PullRequest
1 голос
/ 14 ноября 2011

Инструкции:

Напишите программу, которая будет читать строку текста, оканчивающуюся точкой, которая служит в качестве часового значения.Отобразите все буквы, встречающиеся в тексте, по одной в строке и в алфавитном порядке, а также количество раз, когда каждая буква встречается в тексте.Используйте массив базового типа int длиной 26, чтобы элемент с индексом 0 содержал число a s.и индекс 1 содержит число b с и т. д.

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 ]

2 голосов
/ 14 ноября 2011

Учитывая, что это домашнее задание и инструкции очень специфичны, вы должны читать текст за символом вместо использования встроенных функций

Если ваш текстовый файл был что-то вроде

abcabca.

Вывод должен выглядеть так: a появляется три раза, b появляется два раза и т. Д. И т. Д.

Так что ваш алгоритм должен быть примерно таким:

  1. Читать следующий символ
  2. Если char - точка, переход к 5
  3. Если char это пробел, переходите к 1.
  4. Если char находится между <-> z. обновить счетчик в arr [0..25] и перейти к 1
  5. выходной arr [0..25] по одному на строку
1 голос
/ 14 ноября 2011

Было ли предписано, что это назначение выполняется на 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 - D или CTRL - Z с большинства консолей) или новая строка отправляется. Таким образом, часовой символ имеет ограниченное использование, так как вам все равно придется что-то делать после ввода ".".

0 голосов
/ 14 ноября 2011

Вам нужен массив типа int (например, int[] counts = new int[26];). После того, как вы прочитали строку ввода, проверьте ее символ за символом в цикле.Если символ не является периодом, тогда увеличьте соответствующий элемент массива count.(Если символ a, то увеличивается counts[0]; если b, увеличивается counts[1]; и т. Д. Совет: вы можете вычесть a из символа, чтобы получить соответствующий индекс.)период, выйдите из цикла и напечатайте результаты (возможно, используя второй цикл).

0 голосов
/ 14 ноября 2011
  1. Вы должны проверить, есть ли период в конце или нет. Поэтому последний символ должен быть «.».
  2. Затем возьмите длину строки перед последним '.'.
  3. Для счетной части создайте массив, как вы делаете: int [] name = new int [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» в качестве ключей и считая соответствующие значения. и тогда поиск и показ значений также будет легче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...