#android #string #random
#Android #строка #Случайный
Вопрос:
Я делаю игру типа бинго. У меня есть сетка imagebuttons размером 5×5, каждая со своим собственным textview. Когда приложение запускается или сбрасывается, я хочу, чтобы в каждом textview отображалась случайная строка, при этом ни одна строка не отображалась дважды во время игры. В настоящее время у меня есть строки в массиве ресурсов со 127 элементами:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="tile_text">
<item>String 1</item>
<item>String 2</item>
<item>String 3</item>
...all the way to String 127
</string-array>
</resources>
И для отображения случайной строки в каждом текстовом представлении:
public String[] myString;
Resources res = getResources();
myString = res.getStringArray(R.array.tile_text);
Random random = new Random(System.currentTimeMillis());
int[] textViews = {
//I have all my textviews added to this array
};
for(int v : textViews) {
TextView tv = (TextView)findViewById(v);
tv.setText(myString[random.nextInt(myString.length)]);
}
Приведенное выше работает хорошо, но даже при наличии 200 строк в массиве на выбор некоторые элементы все равно отображаются дважды. Есть ли способ заставить массив перемешиваться и не выбирать одну и ту же строку дважды для каждой игры? Я искал и нашел информацию о случайных строках, но ничего о неповторяющихся случайных строках, поэтому прошу прощения, если это дублирующий вопрос.
Ответ №1:
Я бы сохранил список строк, которые вы уже добавили, а затем продолжал бы выбирать новые случайные строки, пока вы не найдете ту, которой еще нет в вашем списке.
Что-то вроде этого:
Vector<String> alreadyUsed = new Vector<String>();
for(int v : textViews) {
TextView tv = (TextView)findViewById(v);
String nextString;
do {
nextString = myString[random.nextInt(myString.length)];
} while (alreadyUsed.contains(nextString));
alreadyUsed.add(nextString);
tv.setText(nextString);
}
Комментарии:
1. Спасибо, именно то, что я искал! Я также добавил alreadyUsed.clear() вне цикла for, чтобы он мог снова выбирать из всех строк в каждой новой игре, но он не добавляет одну и ту же строку (строки) более одного раза в каждой игре.