Как удалить элемент из списка массивов, используя только одно из его значений? - PullRequest
0 голосов
/ 06 октября 2018

Я использую список массивов пользовательских объектов, которые у меня есть.Давайте рассмотрим список массива пользователей, где у каждого пользователя есть, например, идентификатор пользователя, имя пользователя и т. Д.Теперь мне нужно удалить пользователя на основе его идентификатора только потому, что когда я хочу удалить пользователя, в нем есть что-то, что изменилось ранее, поэтому я не могу стереть его с помощью объекта user. Единственная идея, которую я должен сделать, этопереберите всех пользователей списка, но эта идея мне не нравится.Поэтому мой вопрос заключается в том, как я могу удалить объект пользователя из массива списка пользователей, используя идентификатор пользователя, без необходимости циклически перебирать всех пользователей списка?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Этот код иллюстрирует все, что вы хотели.Обратите внимание, что методы hashCode, equals и compareTo переопределяются.

package com.pkr.test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class User implements Comparable<User> {

    public static SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");

    private long userId;
    private String userName;
    private Date createdDate;

    public User(long userId, String userName, Date createdDate) {
        this.userId = userId;
        this.userName = userName;
        this.createdDate = createdDate;
    }

    public long getUserId() {
        return userId;
    }

    public void setUserId(long userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public String toString() {
        return String.format("userId: %s, userName: %s, createdDate: %s",
                new Object[] { userId, userName, sdf.format(createdDate) });
    }

    public boolean equals(Object o) {
        if (o instanceof User) {
            return ((User) o).getUserId() == this.getUserId();
        }
        return false;
    }

    public int hashCode() {
        return new Long(userId).hashCode();
    }

    @Override
    public int compareTo(User o) {
        return this.getCreatedDate().compareTo(o.getCreatedDate());
    }

    public static void main(String args[]) throws Exception {
        Set<User> userSet = new HashSet<User>();
        userSet.add(new User(1, "Pushpesh", sdf.parse("16-02-2018")));
        userSet.add(new User(2, "Vikrant", sdf.parse("12-02-2018")));
        userSet.add(new User(3, "Abhay", sdf.parse("11-02-2018")));
        userSet.add(new User(4, "Komal", sdf.parse("18-02-2018")));

        userSet.stream().forEach(System.out::println);

        // this will remove user with id 2 no matter what his name and
        // createdDate are
        userSet.remove(new User(2, "Vikrant", sdf.parse("12-02-2018")));

        System.out.println("After removing userId 2");
        userSet.stream().forEach(System.out::println);

        System.out.println();

        List<User> userList = new ArrayList<User>(userSet);
        System.out.println("Before sorting");
        userList.stream().forEach(System.out::println);
        Collections.sort(userList); // This will sort based on date

        System.out.println("After sorting");
        userList.stream().forEach(System.out::println);

    }

}

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

После выполнения этот код выдает следующий вывод:

userId: 1, userName: Pushpesh, createdDate: 16-02-2018
userId: 2, userName: Vikrant, createdDate: 12-02-2018
userId: 3, userName: Abhay, createdDate: 11-02-2018
userId: 4, userName: Komal, createdDate: 18-02-2018
After removing userId 2
userId: 1, userName: Pushpesh, createdDate: 16-02-2018
userId: 3, userName: Abhay, createdDate: 11-02-2018
userId: 4, userName: Komal, createdDate: 18-02-2018

Before sorting
userId: 1, userName: Pushpesh, createdDate: 16-02-2018
userId: 3, userName: Abhay, createdDate: 11-02-2018
userId: 4, userName: Komal, createdDate: 18-02-2018
After sorting
userId: 3, userName: Abhay, createdDate: 11-02-2018
userId: 1, userName: Pushpesh, createdDate: 16-02-2018
userId: 4, userName: Komal, createdDate: 18-02-2018
0 голосов
/ 06 октября 2018

Вот пример в javascript, но его можно легко переписать в java, используя любой тип словаря / карты.

people = new Map()
user = {id:"das", name: "Darek"}
people.set(user.id, user)
user = {id:"aaa", name: "Czarrek"}
people.set(user.id, user)
user = {id:"bbb", name: "Marek"}
people.set(user.id, user)

console.log(people.get("das"), people.get("aaa"), people.get("bbb"), people.size);

people.delete('aaa');

console.log(people.get("das"), people.get("aaa"), people.get("bbb"), people.size);

Карта добавляет работы в O (1) (для хэш-карт), удаление также в O (1).Если структура данных, которую вы выбрали для использования на вашем языке, реализована с использованием некоторого короля деревьев, тогда обе операции выполняются в O (log (n)) (вероятно).

Если имеется только случайно отсортированный список List и нет дополнительных данных, тоЕдинственный вариант - просмотреть все элементы списка.И это не может быть сделано быстрее, чем O (n)

Вы должны использовать Map / Hashmap / Dictionary (неважно, как они называются на вашем языке), с самого начала, если вы хотите иметь возможностьбыстро выбирать / удалять предметы (т. е. O (log n) или лучше)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...