Случайная неповторяющаяся строка Android

#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, чтобы он мог снова выбирать из всех строк в каждой новой игре, но он не добавляет одну и ту же строку (строки) более одного раза в каждой игре.