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

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

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. Я пытался сделать это:

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() && itp.hasNext(); ) {
    if (!it.next().contains(s)) {
        itp.remove();
        it.remove();
    }

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

2 ответа

Решение

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

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

 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 не является параллельным объектом, а также методом удаления.

1

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

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
    }
}

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

1
Другие вопросы по тегам