Изменить случайно индексированный гласный в строке: граница должна быть положительной

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
Другие вопросы по тегам