Фильтрация ключей Guava HashMultimap по количеству - PullRequest
3 голосов
/ 27 сентября 2011

Я создал хэш-мультикарту следующего типа: ключ в виде пары строки, строки и значения длиной.

HashMultimap<Pair<String, String>, Long> hm = HashMultimap.create();

Я вставил некоторые значения в таблицу, используя функцию put.

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

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

Мэтт имеет процессуальный путь покрыты. Более функциональный подход (все еще многословный, поскольку у Java еще нет замыканий) будет выглядеть примерно так:

public class MoreThanOnePredicate<T extends Map.Entry<?, ? extends Collection<?>>> implements Predicate<T> {
    public boolean apply(T entry) {
       return entry.getValue().size() > 1;
    }
}

//...
return Maps.filterEntries(hm.asMap(), new MoreThanOnePredicate<Pair<String, String>, Collection<Long>>()).keySet();

У меня нет библиотеки и компилятора передо мной, поэтому, возможно, есть некоторые нерешенные проблемы с генериками.

2 голосов
/ 27 сентября 2011

Это должно быть немного эффективнее, чем версия Мэтта, так как поиск по ключам не используется:

Set<Pair<String, String>> r = Sets.newHashSet();
for(Entry<Pair<String, String>> e : create.keys().entrySet()) {
   if(e.getCount() > 1) r.add(e.getElement());
}
2 голосов
/ 27 сентября 2011
Set<Pair<String, String>> keysWithMultipleValues = Sets.newHashSet();

for (Pair<String, String> key : hm.keySet())
{
    if (hm.get(key).size() > 1)
    {
        keysWithMultipleValues.add(key);
    }
}
...