Я видел , как получить случайную строку из текстового файла , но указанный там метод (принятый ответ) работает ужасно медленно.Он работает очень медленно в моем текстовом файле объемом 598 КБ, и все еще медленно в моей версии этого текстового файла, который имеет только одну из каждых 20 строк, по 20 КБ.Я никогда не пройду через раздел «а» (это список слов).
Исходный файл содержит 64141 строк;укороченный имеет 2138 строк.Для генерации этих файлов я взял список слов Linux Mint 11 /usr/share/dict/american-english
и использовал grep
, чтобы удалить что-либо с заглавными буквами или апострофом (grep -v [[:upper:]] | grep -v \'
).
Я использую код
String result = null;
final Random rand = new Random();
int n = 0;
for (final Scanner sc = new Scanner(wordList); sc.hasNext();) {
n++;
if (rand.nextInt(n) == 0) {
final String line = sc.nextLine();
boolean isOK = true;
for (final char c : line.toCharArray()) {
if (!(constraints.isAllowed(c))) {
isOK = false;
break;
}
}
if (isOK) {
result = line;
}
System.out.println(result);
}
}
return result;
, который немного адаптирован из Ответ Итая .
Объект constraints
является KeyboardConstraints
, который в основном имеет один метод isAllowed(char)
:
public boolean isAllowed(final char key) {
if (allAllowed) {
return true;
} else {
return allowedKeys.contains(key);
}
}
, где allowedKeys
и allAllowed
предоставляются в конструкторе.Используемая здесь переменная constraints
имеет "aeouhtns".toCharArray()
в качестве allowedKeys
с выключенным allAllowed
.
По сути, я хочу, чтобы метод выбрал случайное слово , которое удовлетворяет ограничениям. (например, для этих ограничений будет работать «outvote», но не «работник», потому что «w» отсутствует в "aeouhtns".toCharArray()
).
Как я могу это сделать?