#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
}
}
Спасибо всем, кто помог