Изменение или на наш

#java

#java

Вопрос:

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

 import java.util.Scanner;

public class main {

    public static void main(String[] args){


        //Initializing Variables
        Scanner input = new Scanner(System.in);
        char[] vowels = new char[] {'a','e','i','o','u'};
        boolean hasVowel = false;
        boolean running = true;
        boolean oR = false;

        while(running){
            //Check for word
            System.out.println("Enter a word more than 4 letters long or type quit to stop");
            String word = input.nextLine();
            if(word.equalsIgnoreCase("quit")){
                System.exit(0);
            }
                while(word.length() <= 4){
                    System.out.println("That word is not more than 4 letters long");
                    word = input.next();
                }

                //Used to insert words
                StringBuilder stringBuilder = new StringBuilder(word);

                //Check for the letters
                char x = word.charAt(word.length()-2);
                if(word.endsWith("r")){
                    if(x == 'o') {
                        oR = true;
                        System.out.println("Has or");
                        for (char c : vowels) {
                            if (c == word.charAt(word.length() - 3)) {
                                hasVowel = true;
                                oR = false;

                            }
                        }
                    }
                }


                //output
                if (hasVowel){
                    System.out.println(word);
                }
                else{
                    if(oR = true) {
                        stringBuilder.insert(word.length() - 1, "u");
                        System.out.println(stringBuilder.toString());
                    }
                    else if (oR = false) {
                        System.out.println(word);
                    }
                }
                System.out.println(hasVowel);
                System.out.println(word.charAt(word.length()-3));

            }
        }
}
  

Если бы кто-нибудь мог мне помочь, это было бы потрясающе!

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

1. Используйте регулярные выражения, может быть менее производительным, но его будет легче записать и меньше шансов на сбой.

2. Возможно, вам потребуется пересмотреть свои правила преобразования, потому что они преобразуются for в four , doctor -> doctour, donor -> donour, error -> errour, sailor -> sailour, pastor -> pastour и многие другие, и НЕ преобразуются behavior, savior

Ответ №1:

Ваша проблема в этой строке:

 if(oR = true) {
  

Это всегда будет true , потому что это присваивание, а не проверка на равенство. Вы хотите == здесь.

Также обратите внимание, что else предложение, которое идет с этим:

 else if (oR = false) {
  

может быть просто:

 else {
  

поскольку, если логического значения нет true , оно должно быть false .

Ответ №2:

Таким образом, вы можете редактировать

 public static void main(String[] args){


    //Initializing Variables
    Scanner input = new Scanner(System.in);
    char[] vowels = new char[] {'a','e','i','o','u'};
    boolean hasVowel = false;
    boolean running = true;
    boolean oR = false;

    while(running){
        //Check for word
        System.out.println("Enter a word more than 4 letters long or type quit to stop");
        String word = input.nextLine();
        if(word.equalsIgnoreCase("quit")){
            System.exit(0);
        }
            while(word.length() <= 4){
                System.out.println("That word is not more than 4 letters long");
                word = input.next();
            }

            //Used to insert words
            StringBuilder stringBuilder = new StringBuilder(word);

            //Check for the letters
            char x = word.charAt(word.length()-2);
            if(word.endsWith("r")){
                if(x == 'o') {
                    oR = true;
                    System.out.println("Has or");
                    for (char c : vowels) {
                        if (c == word.charAt(word.length() - 3)) {
                            hasVowel = true;
                            oR = false;

                        }
                    }
                }
            }


            //output
            if (hasVowel){
                System.out.println(word);
            }
            else{
                if(oR) { //if(oR == true)
                    stringBuilder.insert(word.length() - 1, "u");
                    System.out.println(stringBuilder.toString());
                }
                else { //else if (!oR) //else if (oR == false) 
                    System.out.println(word);
                }
            }
            System.out.println(hasVowel);
            System.out.println(word.charAt(word.length()-3));

        }
    }
  

Ответ №3:

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

Основное регулярное выражение для замены суффикса -or на суффикс -our при условии, что -or перед ним не стоит гласная, выглядит следующим образом:

 public String simpleOrToOur(String word) {
    return word.replaceAll("(\w [^aeiou])or", "$1our");
}
  

Однако начальное правило, похоже, неверно, потому что замены НЕ должны происходить в нескольких случаях, когда перед or ними есть согласный, и могут происходить для -ior префикса:

  • bor : нет rubour
  • cor : нет decour, mucour , только rancour/succour
  • dor : ardour, candour, odour, splendor действительны только, замена не требуется dor, condor, corridor, vendor и т. Д.
  • for : не заменяется на four
  • gor : только clangour, rigour, vigour , и никакой замены в: mortgagor, pledgor, turgor
  • hor : вообще не заменяется: и т.д. anchor, author, camphor,
  • ior : гласную необходимо заменить в behavior, pavior, savior
  • lor : замена не требуется в bachelor, chancellor, counsellor, jailor, sailor, tailor etc.
  • mor : на самом деле это должно быть a[r]mor или umor как в armor, clamor, glamor, humor , без замены в mor, tremor
  • nor : замена требуется только в honor, demeanor и их производных, никакой замены в donor, manor, minor, signor, tenor и т. Д.
  • por : требуется в sapor, vapor , а не в stupor, torpor
  • vor : должно быть avor/ervor как в flavor, fervor , а не в salvor, survivor

Другие префиксы с оставшимися согласными [jkqstwxyz]or также не нуждаются в замене -our .

При этом может быть реализовано более подходящее регулярное выражение, состоящее из префикса, включающего упомянутые подразделы, соединенные с ИЛИ | и суффиксом -or :

 public static String changePrefixOrToOur(String word) {
    return word.replaceAll("(((h?ar|[lt]a|neigh)b)|(ranc|succ)|((ar|can|o|splen)d)|((clan|[rv]i)g)|(vi)|(([cd]o|par|va)l)|((ar?|u)m)|((ho|demea)n)|([sv]ap)|((a|er)v))or",
        "$1our"
);
}
  

Тест:

 String[] replaceableWords = {
    "arbor", "harbor", "neighbor", "labor", "tabor",
    "rancor", "succor",
    "ardor", "candor", "odor", "splendor",
    "clangor", "vigor", "rigor",
    "misbehavior", "pavior", "savior",
    "color", "dolor", "parlor", "valor",
    "amor", "armor", "tumor", "humor", "clamor", "glamor",
    "dishonor", "honor", "misdemeanor",
    "vapor", "sapor",
    "flavor", "endeavor", "favor", "savor", "disfavor"
};

int successCount = 0;
for (String word : replaceableWords) {
    String replaced = changePrefixOrToOur(word);
    successCount  = replaced.endsWith("our") ? 1 : 0;
    //System.out.printf("%s -> %s ? %s%n", word, replaced, replaced.endsWith("our") ? "OK" : "FAIL");
}

System.out.printf("Replaced  `or` to `our`: %d of %d words%n---%n%n", successCount, replaceableWords.length);

String[] notReplaceableWords = {
    "rubor",
    "decor", "mucor",
    "ambassador", "condor", "corridor", "conquistador", "dor", "matador", "picador", "vendor",
    "meteor",
    "for",
    "mortgagor", "pledgor", "turgor", "tangor",
    "abhor", "anaphor", "anchor", "author", "camphor", "metaphor",
    "anterior", "prior", "superior", "warrior",
    "Angkor",
    "bachelor", "counselor", "chancellor", "squalor", "tailor", "sailor", "taylor",
    "mor", "tremor",
    "nor", "assignor", "donor", "governor", "signor", "minor", "manor", "tenor", "intervenor",
    "door", "floor", "moor", "outdoor", "poor", "boor",
    "por", "sopor", "torpor", "stupor",
    "advisor", "censor", "professor", "processor", "sensor", "tensor",
    "actor", "doctor", "director", "factor", "bettor",
    "liquor", "languor", "fluor",
    "survivor", "salvor",
    "xor", "luxor", "taxor",
    "mayor",
    "razor", "seizor", "vizor"
};

for (String word : notReplaceableWords) {
    String replaced = changePrefixOrToOur(word);
    successCount  = replaced.endsWith("or") ? 1 : 0;
    //System.out.printf("%s -> %s ? %s%n", word, replaced, replaced.endsWith("or") ? "OK" : "FAIL");
}
System.out.printf("Not replaced  `or` to `our`: %d of %d words%n", successCount - replaceableWords.length, notReplaceableWords.length);
  

Вывод:

 Replaced `or` to `our`: 37 of 37 words
---

Not replaced  `or` to `our`: 79 of 79 words