#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