Поиск в HashMap на основе данных значения - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть класс Post, который содержит 3 свойства: userId, userName, postId.Каждое сообщение генерирует уникальный идентификатор (String) в базе данных, поэтому я сохраняю его в HashMap, где ключ - это уникальный идентификатор сообщения, а значение - это сообщение, например:

HashMap<String, Post> posts = new HashMap<>(); posts.put(postId, new Post(userId, userName, postId)).

А теперь я хочу найти все сообщения на карте, с указанием userId.Как это сделать?

Ответы [ 4 ]

0 голосов
/ 22 декабря 2018

Это можно сделать, изменив структуру карты.

Если нет необходимости иметь ту же структуру карты, что и у вас, то смена карты для вашей специальной цели решит вашу проблему.

//Initialization of map where key is userId and value is list of Post objects.
HashMap<String, List<Post>> postsByUserId = new HashMap<String, List<Post>>();

//Insertion of post into map. 
List<Post> postList = postsByUserId.get(post.userId);

//Null check and initialization of List.
if (postList == null) { 
    postList = new ArrayList<Post>();
    //Put list into map
    postsByUserId.put(post.userId, postList);
}
//Add object to the list. Either it will be the list retrieved from map or initialized above. 
postList.add(post);

//Retrieve list of post by userId
List<Post> postListOfUserId = postsByUserId.get(userId);

Спасибо!

0 голосов
/ 22 декабря 2018

Это должно сработать,

posts.values().stream().filter(p -> p.userId.equals("yourUserId")).collect(Collectors.toList());
0 голосов
/ 22 декабря 2018

С текущей структурой HashMap, нет способа получить сообщения для userId, но с помощью итерации всей карты и сравнения каждого значения userId.

Если вы хотите найти все сообщенияотносящиеся к конкретному UserId эффективно без циклического прохождения через HashMap, тогда вам придется изменить структуру самого HashMap и не зависеть от postId, сгенерированного базой данных в качестве ключа hashMap.Вместо этого вы должны использовать userId в качестве ключа HashMap:

HashMap<String, ArrayList<Post>> posts = new HashMap<>();

Вставка:

public void addPost(String userId, Post newPost) {
    ArrayList<Post> postsForUserId = posts.get(userId);
    postsForUserId.add(newPost);
}

Получение:

public ArrayList<Post> getPosts(String userId) {
    return posts.get(userId);
}
0 голосов
/ 22 декабря 2018

Вы можете искать в значениях карты соответствие Post с предоставленным идентификатором пользователя:

public List<Post> search(HashMap<String, Post> posts, String userId){
  return
  posts.values()
       .stream()
       .filter(p -> p.getUserId().equals(userId))
       .collect(toList());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...