Проблема с созданием единственных слов во множественном числе

#java

#java

Вопрос:

Я создаю программу, которая может создавать слова в единственном числе во множественном числе, однако я не уверен, как я буду проверять исключения в созданном мной массиве строк. Я знаю, что есть больше исключений, но сейчас я просто хочу получить то, что у меня работает. Я создал метод под названием «checkExceptions», но что бы я поместил в него, чтобы программа сначала проверила этот метод, прежде чем двигаться дальше?

 import java.util.Scanner;

public class FormingPlurals {
    static final String SENTINEL = "done";
    static final Scanner IN = new Scanner(System.in);
    static String[] exceptions = {"fish", "fox", "deer", "moose", "sheep", "cattle"};

    public static void run() {
        while (true) {
            System.out.println("Enter a word to make it plural. Enter 'done' to stop: ");
            String noun = IN.nextLine();
            if (noun.toLowerCase().equals(SENTINEL)) {
                System.out.println("Goodbye...");
                break;
            }
            System.out.println(makePlural(noun)   " ");
        }
    }

    public static void checkExceptions() {

    }

    static String makePlural(String singularWord) {
        String pluralWord = "";
        int length = singularWord.length();
        String checker = singularWord.substring(0, singularWord.length() - 1);
        char lastLetter = singularWord.charAt(singularWord.length() - 1);

        if (length == 1) {
            pluralWord = singularWord   "'s";
        } else
            switch (lastLetter) {
                case 's':
                case 'x':
                case 'z':
                    pluralWord = singularWord   "es";
                    break;
                case 'h':
                    if ((singularWord.charAt(singularWord.length() - 2) == 'c') || (singularWord.charAt(singularWord.length() - 2) == 's')) {
                        pluralWord = singularWord   "es";
                        break;
                    }
                case 'f':
                    if (EnglishConsonant(singularWord.charAt(singularWord.length() - 2))) {
                        pluralWord = checker   "ves";
                        break;
                    }
                case 'y':
                    if (EnglishConsonant(singularWord.charAt(singularWord.length() - 2))) {
                        pluralWord = checker   "ies";
                        break;
                    }
                default:
                    pluralWord = singularWord   "s";
                    break;
            }
        return pluralWord;
    }

    public static boolean EnglishConsonant(char ch) {
        switch (Character.toLowerCase(ch)) {
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                return false;
            default:
                return true;
        }
    }


    public static void main(String[] args) {
        run();
    }
}
  

Ответ №1:

Это также можно сделать с помощью массивов, но в этом случае проще использовать map. Вы могли бы создать карту

 Map<String,String> irregularPlurals = new HashMap<>();
irregularPlurals.put("sheep","sheep");
irregularPlurals.put("fox","foxes");
  

Тогда вы могли бы просто использовать методы Map интерфейса, такие как get() или containsKey() , чтобы проверить, имеет ли данное слово неправильную форму множественного числа. Простой способ проверить это тогда был бы:

 String irregularPlural = irregularPlurals.get(singularWord);
if (irregularPlural != null){
   return irregularPlural ;
}
  

Кстати, было бы неплохо переименовать методы checkException() , поскольку в Java исключения и проверяемые исключения являются языковыми понятиями, поэтому читатель может подумать, что этот метод предназначен для обработки исключений Java.

Ответ №2:

Во-первых, я бы поместил массив исключений внутри makePlural самого себя и обработал его там.

Во-вторых, я бы перешел от наиболее специализированного случая к наименьшему, так что

  1. Сначала взгляните на исключения слов
  2. Посмотрите на специальные множественные числа, такие как ‘es’, ‘ves’ и т.д.
  3. добавьте ‘s’ к слову и верните его

Кроме того, в тот момент, когда я нахожу совпадение либо в исключениях, либо в специальных множественных числах, я бы вычислил и немедленно вернул результат, чтобы предотвратить сопоставление других правил и добавление дополнительных элементов в pluralWord

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

 public static boolean isException(String word){
    String[] exceptions={"fish", "deer"};
    for(int i=0;i<exceptions.length();i  ) {
        if(exceptions[i].equals(word))
            return true;
    }

    return false;
}
  

Комментарии:

1. Буду ли я использовать оператор if, который проверял бы, равно ли слово исключениям, или мне понадобится оператор for?

2. Вам нужно и то, и другое: используйте цикл for для перебора каждого элемента массива и используйте if, чтобы проверить, соответствует ли singularWord элементу

3. Я только что обновил свой ответ кодом для поиска по массиву

4. Никаких проблем. пожалуйста, поддержите / примите ответ, если это возможно