найти элемент из ArrayDeque и продвинуть его до конца в Java - PullRequest
0 голосов
/ 04 июня 2018

У меня есть и ArrayDeque<Integer>, которые я перебираю, чтобы найти элемент, и однажды найденный, я хочу подтолкнуть его к нижней части deque.Но это дает мне java.util.ConcurrentModificationException Ошибка.

Любая помощь с демо приветствуется.Возможно, с использованием другого утилиты.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Я не вижу ваш пример, но ваша проблема в том, что вы используете два разных итератора (они могут быть неявными для 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);
}
0 голосов
/ 04 июня 2018

использование этого может помочь вам

Если вы используете 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);
...