Как узнать, существует ли объект в arraylist или нет, основываясь на одной переменной в нем - PullRequest
0 голосов
/ 15 октября 2018

У меня есть список массивов, давайте рассмотрим его для пользователей.Каждый объект пользователя имеет переменную с именем id, которую я пытался использовать, содержит методы с точно таким же объектом, но я удивился, что он не работает .. Как я могу узнать, содержит ли список пользователя с идентификатором, который я ищу, без зацикливанияв элементах списка?Я знаю, что могу использовать цикл, но я ищу лучший способ сделать это

Ответы [ 5 ]

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

Допустим, вы хотите выбрать пользователя с помощью id=23, используя поток,

List<User> usersLlist = New LinkedList<>();
User user;

user = usersLlist.stream().filter( user -> user.id == 23).findAny();

, если вы используете метод get для получения идентификатора пользователя

user = usersLlist.stream().filter( user -> user.getId() == 23).findAny();
0 голосов
/ 15 октября 2018
public class UserList extends ArrayList<User> {
@Override
public boolean contains(Object o) {
    Object[] arr = this.toArray();
    for (Object obj:arr) {
        if(obj.toString().equals(String.valueOf(o))){
            return  true;
        }
    }
    return false;
}}
class User {
String id;
String name;
@Override
public String toString() {
    return id;
}

}

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

Содержащийся в списке массив всегда имеет линейную сложность, означающую, что он всегда проходит по элементам.Если вы хотите, чтобы ваше содержимое работало так, как вы хотели, вы можете переопределить equals и заставить его использовать поле id в классе User.Другим способом решения этой проблемы было бы не использовать список массивов, а HashMap с вашим идентификатором в качестве ключа и пользователем в качестве значения или, возможно, даже HashSet, поскольку он всегда использует equals перед добавлением элементов в коллекцию.

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

Как вы упомянули, можно итерировать список массивов, чтобы получить ответ.Если вы не хотите этого делать, вы можете просто скопировать значения в хэш-карту, например:

Map<String, User> userMap = new HashMap();
for (int i=0; i<arrayList.size(); i++) {
    userMap.put(arrayList.get(i).getId(), arrayList.get(i));
}
String isExist = userMap.containsKey(id);
0 голосов
/ 15 октября 2018

Если вы не переопределили equals в своем классе User, он проверит, является ли это тем же экземпляром, а не равны ли значения полей.Если вы не хотите переопределять equals, используя только идентификатор, вы можете сохранить пользователей в

Map<String,User> users; => users.containsKey(id) 

, где ключом является id, или оставить только идентификаторы в отдельном

Set<String> ids; and call contains. => ids.contains(id)
...