Изменить случайно индексированный гласный в строке: граница должна быть положительной
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
public class MachinePedagogy {
public static void main(String[] args) throws IOException {
changeVowel("dictionary.txt");
}
private static void changeVowel(String path) throws IOException {
char ch;
BufferedWriter bWriter = new BufferedWriter(new FileWriter(new File("changevowel.txt")));
String aeiou = "aeiou";
char[] vowels = aeiou.toCharArray();
BufferedReader bReader = new BufferedReader(new FileReader(new File(path)));
for(String temp = bReader.readLine(); temp != null; temp = bReader.readLine()){
int counter = 0;
char[] characters = temp.toCharArray();
for(int i = 0; i < temp.length(); i++){
ch = temp.charAt(i);
if(
ch == 'a' ||
ch == 'e' ||
ch == 'i' ||
ch == 'o' ||
ch == 'u'){
counter++;
}
}
Random rand = new Random();
int vIndex[] = new int[counter];
int index = 0;
for (int j = 0; j <temp.length(); j++){
ch = temp.charAt(j);
if(
ch == 'a' ||
ch == 'e' ||
ch == 'i' ||
ch == 'o' ||
ch == 'u'){
vIndex[index] = j;
index++;
}
}
int random2 = (rand.nextInt(vIndex.length));
int random1 = (rand.nextInt(vowels.length));
characters[vIndex[random2]] = vowels[random1];
temp = String.valueOf(characters);
bWriter.write(temp + "\n");
}
bReader.close();
bWriter.close();
}
}
Почему моя привязка иногда отрицательна к этим массивам?
Exception in thread "main" java.lang.IllegalArgumentException: bound must be positive
at java.util.Random.nextInt(Unknown Source)
at MachinePedagogy.changeVowel(MachinePedagogy.java:56)
at MachinePedagogy.main(MachinePedagogy.java:14)
строка 56:
characters[vIndex[random2]] = vowels[random1];
Строка 14:
changeVowel("dictionary.txt");
Я хочу отредактировать случайный гласный в строке и заменить его другим случайным гласным, предпочтительно отличным от того, что было раньше. Dictionary.txt - это просто Стэнфордский словарь, если вам это нужно для компиляции кода.
Многие примеры, которые я нашел при замене гласных, следуют этой логике.
temp.replaceAll( "[aeiou]", "?" );
Я не хочу заменять все гласные, только один случайно индексированный гласный. Я думаю, что это может иметь какое-то отношение к nextInt(), но я смущен, когда читаю документацию Random#nextInt(int) о том, почему это может быть. Что я прочитал из других вопросов Stackru, так это то, что это правильный способ создания случайных индексов для массива.
Я написал средство проверки орфографии и хочу проверить его возможности на точность с обычно допущенной ошибкой изменения одного гласного слова. Я планирую удалить правильные слова из большого списка, который я создал, запустив changevowel.txt против dictionary.txt позже и удалив правильные слова из changevowel.txt, но это не имеет значения для насущной проблемы.
2 ответа
Исключение в потоке "main" java.lang.IllegalArgumentException: привязка должна быть положительной в java.util.Random.nextInt(Неизвестный источник)
Не из этой линии characters[vIndex[random2]] = vowels[random1];
Но эта строка:
int random2 = (rand.nextInt(vIndex.length));
rand.nextInt
аргумент должен быть > 0
, но vIndex.length == 0
как-то.
Попробуйте эту логику:
- Получить все индексы гласных из слова
- Выберите случайный гласный индекс и получите его из слова
- Выберите другой случайный гласный из "списка гласных", который отличается от предыдущего шага
- Заменить выбранную случайную гласную на новую случайную гласную
Пример:
static String vowels = "AEIOU";
public static void main(String[] args) throws Exception {
String word = "MIRACULOUSNESS";
char[] wordArray = word.toCharArray();
Random rand = new Random();
List<Integer> vowelIndexes = getVowelIndexes(word);
// Choose random vowel index and get the random vowel from the word
int randomVowelIndex = vowelIndexes.get(rand.nextInt(vowelIndexes.size()));
char randomVowel = word.charAt(randomVowelIndex);
// Choose random vowel replacement that isn't the same as the randomVowel
char replacementVowel = randomVowel;
while (replacementVowel == randomVowel) {
replacementVowel = vowels.charAt(rand.nextInt(vowels.length()));
}
System.out.printf("Before: %s\n", word);
// Replace the vowel
wordArray[randomVowelIndex] = replacementVowel;
word = new String(wordArray);
System.out.printf("After : %s\n", word);
}
public static List<Integer> getVowelIndexes(String word) {
List<Integer> result = new ArrayList();
for (int i = 0; i < word.length(); i++) {
if (vowels.contains(""+word.charAt(i))) {
result.add(i);
}
}
return result;
}
Результаты (Зависит от каждого запуска):
Before: MIRACULOUSNESS
After : MIRECULOUSNESS