2

我有并且ArrayDeque<Integer>我正在循环查找一个元素,一旦找到我想将它推到双端队列的底部。但它给了我java.util.ConcurrentModificationException错误。

感谢您对演示的任何帮助。也许也使用不同的工具。

4

2 回答 2

0

我没有看到您的示例,但您的问题是您使用两个不同的迭代器(它们可能是 JVM 隐含的,例如当您使用时for loop)来读取和修改deque。每个都Iterator包含检查并发修改的计数器。为避免java.util.ConcurrentModificationException您必须同时使用一个Iterator

变体 1:

public static void moveLast(Deque<Integer> deque, int val) {
    if (deque.remove(val))
        deque.add(val);
}

变体 2:

public static void moveLast(Deque<Integer> deque, int val) {
    boolean exists = false;

    for (int i = 0, size = deque.size(); i < size; i++) {
        Integer item = deque.remove();

        if (exists)
            deque.add(item);
        else if (val == item)
            exists = true;
        else
            deque.add(item);
    }

    if (exists)
        deque.add(val);
}
于 2018-06-04T16:34:33.397 回答
0

使用它可以帮助你

如果您使用的是 pojo havin,则实施的 Equals 足以帮助列表删除想要的对象

pojo类

 class User {

    private String username;

    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }



    /**
     * Get the value of password
     *
     * @return the value of password
     */
    public String getPassword() {
        return password;
    }

    /**
     * Set the value of password
     *
     * @param password new value of password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Get the value of username
     *
     * @return the value of username
     */
    public String getUsername() {
        return username;
    }

    /**
     * Set the value of username
     *
     * @param username new value of username
     */
    public void setUsername(String username) {
        this.username = username;
    }



    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final User other = (User) obj;
        if (!Objects.equals(this.username, other.username)) {
            return false;
        }
        if (!Objects.equals(this.password, other.password)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "\nUser{" + "username=" + username + ", password=" + password + '}';
    }


}

用例教程

    ArrayDeque arrayDeque = new ArrayDeque();
    arrayDeque.add("A");
    arrayDeque.add("B");
    arrayDeque.add("C");
    arrayDeque.add("D");

    System.out.println(arrayDeque);

    arrayDeque.remove("A");
    arrayDeque.add("A");
    System.out.println(arrayDeque);

    ArrayDeque<User> usersDeque = new ArrayDeque();
    final User userTaleb = new User("Taleb", "Mohammed");
    usersDeque.add(userTaleb);
    usersDeque.add(new User("Mansouri", "Abdellah"));
    usersDeque.add(new User("Ziane", "Nadir"));

    System.out.println(usersDeque);

    usersDeque.remove(userTaleb);
    usersDeque.add(userTaleb);

    System.out.println(usersDeque);
于 2018-06-04T15:51:02.593 回答