Как удалить элемент из ArrayList, если условие в другом ArrayList верно - PullRequest
1 голос
/ 19 апреля 2019

У меня есть 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 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 ]

1 голос
/ 20 апреля 2019

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

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

 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 голос
/ 20 апреля 2019

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

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

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

...