public String стенография (String in) - PullRequest
0 голосов
/ 03 мая 2010

Я застрял на этом коде.

Код должен использовать класс StringBuilder для построения выходной строки, добавляя не гласные символы из аргумента в возвращаемый результат. Он должен идентифицировать гласные, которые должны быть удалены, используя созданный мной вспомогательный метод, который является public boolean isVowel (char c)

public String shorthand(String in) это метод, с которым мне нужна помощь. Я создал stringbuilder, но условие if не принимает метод isVowel.

import java.io.*;
import java.util.*;


public class Shorthand
{    

    public boolean isVowel(char c)
   {

       if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'A'|| c == 'E'||c == 'I'|| c == 'O'|| c == 'U')
       {
           return true;
       }
       else
       {
           return false;
       }
   }

    //TODO Complete the shorthand method
    public String shorthand(String in) //this is the code I need help with
    {
      StringBuilder vowel = new StringBuilder();

      if (isVowel() == false)
      { 
        vowel.append(in); 
       } 
          return vowel.toString(); 
    }

    //TODO Complete the run method
    public void run() throws IOException
    {
       String yourLine; 
       Scanner sc = new Scanner(System.in); 
       yourLine = sc.nextLine(); 
       while(!yourLine.equals("*"));
       {
            System.out.println("Enter your line of text");
       }
       yourLine = sc.nextLine(); 
    }
}

Ответы [ 5 ]

2 голосов
/ 04 мая 2010

Из вашего кода можно многому научиться.

При возврате логического выражения

Вот улучшенная версия isVowel(char ch):

public boolean isVowel(char ch) {
    ch = Character.toLowerCase(ch);
    return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
}

Примечаниездесь две вещи:

  • ch упрощен до строчной формы, поэтому у вас гораздо меньше проверок
  • Нет оператора if.

Здесь есть важный урок: вы никогда не должны писать что-то вроде этого:

if (expression) {
   return true;
} else {
   return false;
}

Вместо этого вы всегда должны писать:

return expression;

Это намного, намного понятнее.


Ознакомившись с библиотекой Java

Обратите внимание на использование Character.toLowerCase в приведенном выше коде.Фактически, можно сделать код еще проще с помощью, например, String.indexOf:

public boolean isVowel(char ch) {
    return "aeiouAEIOU".contains("" + ch);
}

Это использует String.contains, используя конкатенацию строк дляэффективно преобразовать char в String (что implements CharSequence).

API-ссылка

  • java.lang.Character
    • Методы digit, isXXX и toXXX очень полезны
  • java.lang.String
    • Многие полезные методы для работы со строками

См. также


Не сравнивайте с логическими константами

Новички, как правило, пишут что-то вроде этого:

if (expression1 == false) {
}
//...
if (expression2 == true) {
}

Особенно в Java вывместо этого следует научиться писать так:

if (!expression1) {
}
//...
if (expression2) {
}

Это намного понятнее и гораздо менее подвержено ошибкам.

См. также


При итерации по каждому символу String

Вот простой цикл, чтобы показать, как индексируется способ сделать это:

    String s = "Abracadabra";
    for (int i = 0; i < s.length(); i++) {
        System.out.print("[" + s.charAt(i) + "]");
    } // prints "[A][b][r][a][c][a][d][a][b][r][a]"

При этом используются length() и charAt(int index) методы String.

В качестве альтернативы, если вы этого не сделаетеЕсли вам нужен индекс, вы также можете использовать String.toCharArray(), чтобы вместо этого сделать foreach для char[].Это не экономит место (char[] должен быть заново выделен, чтобы гарантировать неизменность), но очень читабельно и кратко:

    String s = "Abracadabra";
    for (char ch : s.toCharArray()) {
        System.out.print("[" + ch + "]");
    } // prints "[A][b][r][a][c][a][d][a][b][r][a]"

См. Также


О процессе разработки программного обеспечения

Как уже упоминали другие, ваш метод run очень проблематичен: в настоящее время он приводит к бесконечному циклу.

Вместо этого вы могли бы сделать следующее:напишите так называемые " заглушки методов " для isVowel (например, просто return true;) и shorthand (например, просто return "";).Они еще не верны, но важно то, что они сейчас компилируются.Это дает вам время сосредоточиться на run, чтобы убедиться, что у вас есть правильно работающий цикл и что вы можете извлечь соответствующий ввод от пользователя.Вы должны довести код до точки его компиляции и запуска, чтобы вы могли проверить и быть уверенными, что ваш run делает то, что ему нужно.В этот момент вы можете начать заполнять ранее озвученные методы, применяя при необходимости соответствующие функциональные возможности.

Если у вас возникают трудности с достижением этого, вы можете задать вопросы об этом конкретном аспекте домашней работы (носначала найдите его в stackoverflow!).Это дает вам качественные и сфокусированные ответы на проблемы по мере их возникновения (в отличие от написания такого проблемного кода, чтобы люди могли его использовать повсюду), и поэтому более поучителен для вас.

Этот вопрос также, вероятно, будет более полезным для других, поскольку он более общий по контексту (т.е. речь идет о том, как написать цикл подсказок для пользователя, а не о том, как выполнять домашнюю работу) (напротив, этот вопрос в настоящее время называется public String shorthand(String in)).

Еще одна вещь, которую вы можете сделать, это выполнить так называемые модульные тесты . isVowel является БОЛЬШИМ кандидатом на это: чтобы проверить его правильность, вам нужно знать, как его вызывать (то, с чем у вас, очевидно, возникают проблемы).

Поначалу все это кажется ненужной работой. Предположительно, юнит-тесты не являются частью домашней работы (хотя, вероятно, так и должно быть), и написание заглушек, а затем замена их чем-то другим кажется пустой тратой времени, и вместо этого вы должны просто сделать это правильно с первого раза. Именно потому, что это домашнее задание, вы должны принять и практиковать методологии хорошего процесса разработки программного обеспечения. Это для вашего же блага.

Смотри также

2 голосов
/ 04 мая 2010

Вы не передали char c аргумент isVowel ()

Попробуйте это:

public String shorthand(String in) { 
        StringBuilder vowel = new StringBuilder();

        for (char c : in.toCharArray()) {
            if (!isVowel(c)) {
                vowel.append(c);
            }
        }

        return vowel.toString();
}

РЕДАКТИРОВАТЬ: Ваш run() метод кажется немного странным ...

Может быть, это то, что вы хотели?

public void run() throws IOException
{
    String yourLine;
    Scanner sc = new Scanner(System.in);
    while (!sc.nextLine().equals("*")) {
        System.out.println("Enter your line of text");
    }
}

Что касается примечания, он даже не вызывает метод shorthand().

1 голос
/ 04 мая 2010

Пожалуйста, отметьте это как домашнее задание

Кстати: здесь много проблем

Во-первых, вам нужно, чтобы ваш main вызывал shortHand в каждой строке и, возможно, печатал результаты.

Во-вторых, ваша сокращенная функция должна перебирать все символы строки, сейчас вы этого не делаете. Вы будете передавать каждый символ в функцию isVowel.

1 голос
/ 04 мая 2010

Вы хотите что-то вроде этого

public String shorthand(String in)
{
      int length = in.length();
      StringBuilder noVowels = new StringBuilder(length);
      for (int i=0; i<length; i++)
      {
         c = in.charAt(i);
         if (!isVowel(c))
           noVowels.append(c);
      }
      return noVowels.toString(); 
}

PS: ваш метод isVowel проверяет только строчные буквы. Если вы хотите распознать гласные буквы как в верхнем, так и в нижнем регистре, наберите Character.toLowerCase в первой строке isVowel.

РЕДАКТИРОВАТЬ: я не комментировал метод run (), потому что я предполагал, что это работа в процессе. Поскольку у вас есть проблемы с этим, вот исправленная версия.

public static void main(Stirng[] args) throws IOException
{
   Scanner sc = new Scanner(System.in);
   for(;;) {
    System.out.println("Enter your line of text");
    String line = sc.nextLine();
    if (line.equals("*")) break;
    String shortHandLine = shorthand(line);
    System.out.println(String.format("Shorthand form of %s is %s", line, shortHandLine));
   }    
}

Поскольку это приложение, вы можете щелкнуть правой кнопкой мыши и запустить его в большинстве IDE.

1 голос
/ 04 мая 2010

Вам необходимо передать значение char в метод isVowel(). Попробуйте следующее:

public String shorthand(String in) 
{
  StringBuilder vowel = new StringBuilder();

  for (int i=0; i < in.length(); i++)
  {
      if (isVowel(in.charAt(i)) == false)
      { 
        vowel.append(in.charAt(i)); 
      }
  } 
  return vowel.toString(); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...