У меня есть метка и ArrayList. ArrayList состоит из строк из столбца sqlite.
Когда я нажимаю «1» на клавиатуре, случайная строка из ArrayList должна быть применена к тексту в метке и после этого должна быть удалена из ArrayList.
Основная цель - не показывать строки из ArrayList дважды, когда я всегда нажимаю «1»
Как я могу это сделать?
Должен ли я использовать для этой цели другой список из коллекций?
List<String> list = new ArrayList<>();
@FXML private Label lb_randomCard;
mainAnchor.setOnKeyPressed(event -> {
switch (event.getCode()) {
case DIGIT1:
showRandomQuestionCat2();
break;
}
});
Я пытался это сделать, но все еще появлялись случайные строки:
private void showRandomQuestionCat2() {
Random rand = new Random();
String randomString = list.get(rand.nextInt(list.size()));
lb_randomCard.setText(randomString);
list.remove(randomString);
}
EDIT:
Я пытался использовать Collections.shuffle, но ничего не происходит.
Random rand = new Random();
int index = rand.nextInt(list.size());
String randomString = list.get(index);
lb_randomCard.setText(randomString);
list.remove(index);
Collections.shuffle(list);
РЕДАКТИРОВАТЬ 2:
Простите, ребята, за мою глупость! Я вставил неправильный код и мой полный метод:
private void showRandomQuestionCat2() {
int n = (int) (Math.random() * 100);
if (n < 70) {
Random rand = new Random();
int index = rand.nextInt(list.size());
String randomString = list.get(index);
lb_randomCard.setText(list.get(index));
index++;
list.remove(index);
} else if (n < 80) {
Random rand = new Random();
int index2 = rand.nextInt(listSentence.size());
String randomString = listSentence.get(index2);
lb_randomCard.setText(listSentence.get(index2));
index2++;
listSentence.remove(index2);
}
}
Когда я удалил
int n = (int) (Math.random() * 100);
все случайные вещи идут правильно.
Создавая эту случайную вещь в начале метода, я хотел получить шанс 70% / 30% показать строки из двух массивов.
Но теперь я не знаю, как сделать то же самое случайно, но без дубликатов
EDIT3:
Это видео, показывающее, как дублирующиеся строки показывают:
Видео
Это мой полный код с двумя массивами:
@FXML private AnchorPane mainAnchor
@FXML private Label lb_randomCard;
List<String> list = new ArrayList<>();
List<String> listSentence = new ArrayList<>();
@FXML
public void initialize(URL location, ResourceBundle resources) {
//key commands
mainAnchor.setOnKeyPressed(event -> {
switch (event.getCode()) {
case DIGIT1:
generateChar();
Collections.shuffle(list);
Collections.shuffle(listSentence);
showRandomQuestionCat2();
showRandomCard();
}
});
}
//put all values from SQLite table category1 to ArryayList
private void getAllQuest() {
try {
Connection conn = DbConnection.getConnection();
pst = conn.prepareStatement(pq.getGetQuestions());
rs = pst.executeQuery();
while (rs.next()) {
list.add(rs.getString("question"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//put all values from SQLite table sentences to ArryayList
private void getAllSentences() {
try {
Connection conn = DbConnection.getConnection();
pst = conn.prepareStatement(pq.getGetSentences());
rs = pst.executeQuery();
while (rs.next()) {
listSentence.add(rs.getString("sentence"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//set random string from both Arrays and remove after that
private void showRandomQuestionCat2() {
int n = (int) (Math.random() * 100);
if (n < 70) {
Random rand = new Random();
int index = rand.nextInt(list.size());
String randomString = list.get(index);
lb_randomCard.setText(list.get(index));
index++;
list.remove(index);
} else if (n < 80) {
Random rand = new Random();
int index2 = rand.nextInt(listSentence.size());
String randomString = listSentence.get(index2);
lb_randomCard.setText(listSentence.get(index2));
index2++;
listSentence.remove(index2);
}
}