Как удалить строку из ArrayList после показа в метке? - PullRequest
0 голосов
/ 13 января 2019

У меня есть метка и 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);

        }
    }

1 Ответ

0 голосов
/ 13 января 2019

Я предлагаю вам удалить по индексу, а не по значению.

private void showRandomQuestionCat2() {

  Random rand = new Random();
  int index = rand.nextInt(list.size());
  String randomString = list.get(index);
  lb_randomCard.setText(randomString);
  list.remove(index);

 }

Edit: Я смоделировал ваш код на этом простом примере, без дубликатов

public class test
{
    static List<String> list = new ArrayList<>();
    static List<String> listSentence = new ArrayList<>();
    static Random rand = new Random();

    public static void main (String []args)
    {
      list.add("hi1");
      list.add("hi2");
      list.add("hi3");
      list.add("hi4");
      listSentence.add("bye1");
      listSentence.add("bye2");
      listSentence.add("bye3");
      listSentence.add("bye4");

      for (int i=0; i<4; i++)
        showRandomQuestionCat2();
    }

     private static void showRandomQuestionCat2() 
     {

      int n = rand.nextInt(100);
      if (n < 70) {
        int index = rand.nextInt(list.size());
        String randomString = list.get(index);
        System.out.println(list.get(index));
        list.remove(index);

      } else {
        int index2 = rand.nextInt(listSentence.size());
        String randomString = listSentence.get(index2);
        System.out.println(listSentence.get(index2));
        listSentence.remove(index2);
      }
    }
}

На боковой ноте if (n<70) и else if (n<80) не дадут вам 70% / 30% вероятности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...