Java 多图搜索值

Java Multimap search for value

我有一个 Multimap,需要搜索值。 看起来像这样

ListMultiMap<String, Person> pers =  ArrayListMultimap.create();
....
Person person = new Person();
person.setName(name);
peson.setAge(age);
person.setId(id);
...
pers.put(name, person);

我需要名字作为键,应该可以添加例如姓名为 "Bob" 的两个人。 ID 应该是唯一的。

例如:

Name: Bob, ID:1
Name: Bob, ID:2

我知道如何从地图中获取键 "Bob" 的值。 但是我怎样才能只获得 ID 为 1 的 Bob 的值呢?

这将检索 ID 为 1 的人 Bob:

ListMultiMap<String, Person> pers =  ArrayListMultimap.create();
List<Person> persons = pers.get("Bob");
for(Person p : persons){
    if (p.getId() == 1){
        //do something
    }
}

如评论中所述,ListMultiMapget(String key) 方法将为给定键 return 一个 List 元素。由于您的 person.id 不是密钥的一部分,因此不会对 returned 列表产生任何影响。

如I.K。在接受的答案中说,您可以简单地遍历 returned 列表以获取具有给定 ID 的人。

然而,更适合的数据结构可能是 Guava Table,它允许您拥有 2 个键(您也可以将 if 视为 MapMap 的一种,或者在你的情况下 Map<String,Map<Long, Person>>) :

Table<String, Long, Person> personsByNameAndId = HashBasedTable.create();
Person bob = ...;
//put it in the table
personsByNameAndId.put(bob.getName(), bob.getId(), bob);

//lookup by name and ID
Person bobWithId1 = personsByNameAndId.get("Bob", 1l);

//get all Bobs
Collection<Person> allPersonsNamedBob = personsByNameAndId.row("bob").values();

//get person with ID=2 regardless of name
Person personWithId2 = personsByNameAndId.column(2l).values().iterator().next();

虽然检查的答案是正确的,但我认为全 guava 解决方案更优雅:

   Multimap<String, Person> pers =  ArrayListMultimap.create();
   Person firstBob = FluentIterable.from(pers.get("Bob")).firstMatch(new Predicate<Person>() {
        @Override
        public boolean apply(Person p) {
            return p.getId() == 1;
        }
    });