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
}
}
如评论中所述,ListMultiMap
的 get(String key)
方法将为给定键 return 一个 List
元素。由于您的 person.id
不是密钥的一部分,因此不会对 returned 列表产生任何影响。
如I.K。在接受的答案中说,您可以简单地遍历 returned 列表以获取具有给定 ID 的人。
然而,更适合的数据结构可能是 Guava Table
,它允许您拥有 2 个键(您也可以将 if 视为 Map
或 Map
的一种,或者在你的情况下 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;
}
});
我有一个 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
}
}
如评论中所述,ListMultiMap
的 get(String key)
方法将为给定键 return 一个 List
元素。由于您的 person.id
不是密钥的一部分,因此不会对 returned 列表产生任何影响。
如I.K。在接受的答案中说,您可以简单地遍历 returned 列表以获取具有给定 ID 的人。
然而,更适合的数据结构可能是 Guava Table
,它允许您拥有 2 个键(您也可以将 if 视为 Map
或 Map
的一种,或者在你的情况下 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;
}
});