Как удалить элемент из ArrayList, если условие в другом ArrayList истинно

#java #exception #arraylist #jtable #illegalstateexception

#java #исключение #arraylist #jtable #исключение illegalstateexception

Вопрос:

У меня есть JTable с тремя столбцами, каждый из которых заполнен массивом, созданным из ArrayList. Я пытаюсь создать систему поиска, в которой пользователь будет искать значение в первом столбце, а строки JTable будут отфильтровываться, так что только строки, содержащие указанную строку из окна поиска, отображаются в таблице после нажатия кнопки. В другой таблице это сработало путем фильтрации списка массивов, используемого с помощью этого цикла:

 String s = searchBar.getText();
ArrayList<String> fn = new ArrayList<>();
fn.addAll(names); //names is the arraylist that contains all the values that will be filtered
for(Iterator<String> it = fn.iterator(); it.hasNext(); ) {
    if (!it.next().contains(s)) {
        it.remove();
    }
 

Этот код работает для фильтрации массива, но то, что я пытаюсь сделать, это отфильтровать 3 списка ArrayLists только в том случае, если один из списков ArrayLists не содержит строку s.
Я пытался сделать это:

 String s = searchBar.getText();
ArrayList<String> fn = new ArrayList<>();
ArrayList<String> fp = new ArrayList<>();
fn.addAll(names); //names is the arraylist that contains all the values that will be filtered
fp.addAll(numbers)//one of the other arraylists that I want to filter
for(Iterator<String> it = fn.iterator(), itp = fp.iterator(); it.hasNext() amp;amp; itp.hasNext(); ) {
    if (!it.next().contains(s)) {
        itp.remove();
        it.remove();
    }
 

Когда я запускаю этот код, я получаю исключение в потоке «AWT-EventQueue-0» java.lang.Исключение IllegalStateException в строке, где я пишу «itp.remove();».
Есть ли способ, которым я могу удалить оба массива на основе только одного из них?

Комментарии:

1. Добавьте itp.next() также в цикл.

2. Вы не можете выполнять итерации и удалять элементы. Он не синхронизирован. Но вы можете удалить цикл while с момента начала списка

3. На вашем месте я бы выбрал подход ООП и вместо того, чтобы иметь три параллельных List , создал объект для хранения информации и просто составил список этого

4. @GBlodgett Причина, по которой у меня это так, заключается в том, что данные берутся из базы данных sql, и на самом деле я не знал другого способа сделать это, лол

5. @Dred Извините, я не совсем вас понял

Ответ №1:

Я рад, что вы исправили свое исключение. В любом случае, когда я говорил о обратной итерации, я имел в виду что-то подобное

Во-первых, некоторые проверки, такие как

  if(fn.size()==fp.size()){
   // and after that go to delete. 
  for (int i=fn.size(); i>0;i--) { 
      if (fn.contains(s)) {
      fn.remove(i);
      fp.remove(i);
  } }}
 

В любом случае, ваш и мой метод не подходит для многопоточности, потому что ArrayList не является параллельным объектом, а также методом удаления

Ответ №2:

Итак, мне удалось исправить это, используя метод remove из ArrayList вместо метода remove из итератора. Я знаю, что это не рекомендуемый способ сделать это, но, похоже, он не принес никаких негативных последствий, поэтому я пока оставлю его. Код, который я использовал:

 int i = 0;
for (Iterator<String> it = fn.iterator(); it.hasNext(); i  ) {
    if (!it.next().contains(s)) {
        it.remove(); //Iterator's remove
        fp.remove(i);// ArrayList's remove which avoids the error
    }
}
 

Спасибо всем, кто помог