Как удалить только один элемент из arraylist, итерации по нему

66
6

Я хотел удалить один элемент, который соответствует orderID = 542. Но дело в том, что эта программа удаляет два элемента из этого списка. В реальной программе выполняется итерация через arraylist, и я вызываю функцию, чтобы проверить, должен ли этот элемент быть удален из список и эта функция должны удалить элемент из списка

package testMap;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class TestHashMap {
static ArrayList<LimitOrder> a = new ArrayList<>();

public static void main(String args[]) {
create();
}

public static void create() {
LimitOrder l1 = new LimitOrder(1, 100, "145");

LimitOrder l2 = new LimitOrder(1, 100, "542");

LimitOrder l3 = new LimitOrder(1, 100, "355");

a.add(0, l1);
a.add(1, l2);
a.add(2, l3);

Iterator<LimitOrder> i = a.iterator();
while (i.hasNext()) {
boolean toremove = false;
LimitOrder l = i.next();
toremove=remove();
if (toremove == true)
{
System.out.println("Removed "+l.orderID);
i.remove();
}
}

}

public static boolean remove() {
boolean flag = false;
Iterator<LimitOrder> i = a.iterator();
while (i.hasNext()) {
LimitOrder l = i.next();
if (l.orderID.equals("542")) {
flag = true;
}
}
return flag;

}

}

пожалуйста, помогите мне

спросил(а) 2020-04-04T00:26:09+03:00 3 месяца назад
1
Решение
65

Нет необходимости иметь итератор в методе remove, вы можете передать текущий LimitOrder из метода create.

static ArrayList<LimitOrder> a = new ArrayList<>();

public static void main(String args[]) {
create();
}

public static void create() {
LimitOrder l1 = new LimitOrder(1, 100, "145");

LimitOrder l2 = new LimitOrder(1, 100, "542");

LimitOrder l3 = new LimitOrder(1, 100, "355");

a.add(0, l1);
a.add(1, l2);
a.add(2, l3);

Iterator<LimitOrder> i = a.iterator();
while (i.hasNext()) {
LimitOrder l = i.next();
if (remove(l))
{
System.out.println("Removed "+l.orderID);
i.remove();
}
}

}

public static boolean remove(LimitOrder l) {
if (l.orderID.equals("542")) {
flag = true;
}
}

ответил(а) 2020-04-04T00:42:23.631199+03:00 3 месяца назад
39

Обновите функцию remove() для получения и проверки текущего значения итератора.

ответил(а) 2020-04-04T00:26:09+03:00 3 месяца назад
39

Проблема в том, что вы удаляете элементы из списка, которые не совпадают. И это происходит потому, что ваш тест, чтобы решить, нужно ли удалить элемент, неверен. Вы должны проверить, соответствует ли этот элемент... нет, если какой-либо элемент соответствует.

Исправление состоит в том, чтобы изменить тест, чтобы проверить только текущий элемент; например

    ...
Iterator<LimitOrder> i = a.iterator();
while (i.hasNext()) {
LimitOrder l = i.next();
if (isMatch(l)) {
i.remove();
System.out.println("Removed " + l.orderID);
}
}
...

public static boolean isMatch(LimitOrder l) {
return l.orderID.equals("542");
}

ответил(а) 2020-04-04T00:26:09+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема