2012-03-12 5 views
2

гуавы является возможным в гуавы,Проблема с BiMap и LinkedHashMap

  1. Чтобы провести обратный поиск в BiMap для ключа и нескольких значений? Точно, у меня есть ключ и соответствующие несколько значений, я хочу получить ключ от значения.

  2. Чтобы сохранить несколько значений в LinkedHashMap? Точно, я хочу хранить, key - несколько значений в некотором порядке, таким образом, я могу получить ключевую позицию в списке.

+0

На самом деле я хочу решить эту проблему http://stackoverflow.com/questions/9661374/java-hash-table-issue-with-object-refference. Поэтому я считаю, что заменить все «foo» на один «foo», а затем обратный поиск (для Key-Multiple Value Map) или получить ключ от позиции, который сэкономит место (для карты с множественным значением ключа). Однако, кажется, я должен был потратить много места, чем раньше. Есть ли решение Guava этого http://stackoverflow.com/questions/9661374/java-hash-table-issue-with-object-refference. Благодарю. – Arpssss

+1

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

ответ

6

Объявление. 1. Я предполагаю, что вы хотите обратный поиск BiMap (BitMap не существует в Гуаве)? Да, это возможно, вы просто позвоните по номеру inverse на свой номер BiMap<K, V>, и вы получите обратно BiMap<V, K>view вашего бимара.

Пример (взят из тестового набора гуавы в):

public void testMapConstructor() { 
    /* Test with non-empty Map. */ 
    Map<String, String> map = ImmutableMap.of(
     "canada", "dollar", 
     "chile", "peso", 
     "switzerland", "franc"); 
    HashBiMap<String, String> bimap = HashBiMap.create(map); 
    assertEquals("dollar", bimap.get("canada")); 
    assertEquals("canada", bimap.inverse().get("dollar")); 
} 

объявления. 2. Предполагая, что вы имеете в виду «Я хочу сохранить, ключ -> несколько [Коллекция] значения» (Map<K, Collection<V>>), ListMultimap, вероятно, что вы хотите, более ArrayListMultimap (высокоточного пресервы значений порядка) или LinkedListMultimap (сохраняет оба ключа и значения заказ). Если ваш объект будет неизменным, я настоятельно советую вам использовать ImmutableListMultimap.

Вы также можете создать свою собственную реализацию Multimap с помощью factory (бит многословным), то есть я использую:

private static <K, V> ListMultimap<K, V> makeLinkedArrayListMultimap() { 
    return Multimaps.newListMultimap(Maps.<K, Collection<V>>newLinkedHashMap(), 
     new Supplier<List<V>>() { 
     @Override public List<V> get() { 
      return Lists.newArrayList(); 
     } 
     }); 
} 

public static void main(final String[] args) { 
    final ListMultimap<String, String> multimap = makeLinkedArrayListMultimap(); 
    multimap.putAll("one", ImmutableList.of("zero", "three")); 
    multimap.putAll("two", ImmutableList.of("three", "four", "three")); 
    multimap.putAll("three", ImmutableList.<String>of()); // note that this doesn't add key to multimap 
    multimap.put("four", "forty-two"); 

    System.out.println(multimap); 
    // prints {one=[one, three], two=[three, four, three], four=[forty-two]} 

    final List<String> listForOnes = multimap.get("one"); 
    System.out.println(listForOnes.get(0)); 
    // prints zero 
} 

P.S. Взгляните на Guava's wiki, что объясняет как BiMap, так и Multimaps.

+0

Спасибо. На самом деле я хочу решить эту проблему http://stackoverflow.com/questions/9661374/java-hash-table-issue-with-object-refference. Поэтому я считаю, что заменить все «foo» на один «foo», а затем выполнить обратный поиск (для Key-Multiple Value Map) или получить ключ от позиции, которая сэкономит место (для карты с множественным значением ключа). , кажется, из ваших Ans, я должен был потратить много места, чем раньше. Есть ли решение Guava по http://stackoverflow.com/questions/9661374/java-hash-table-issue-with-object-refference. Благодарю. – Arpssss

3

Ближайший в гуавах Multiset отобразить несколько значений ключа, но я сомневаюсь, что она удовлетворяет ваши требования.

  1. Я сомневаюсь, что это хорошая идея, чтобы искать ключ, используя значения (если вы несколько значений отображаются на одной клавише), для того, чтобы сделать это ваше значение должно быть уникальным и учитывая структуру данных (которые, как Map<Key, Collection<Value>) не может быть гарантировано наличие уникальных значений.
  2. Другой вариант с guava - BiMap, который требует уникальных значений и может предоставлять обратные сопоставления (значение -> ключ), но поскольку вам нужно сопоставить несколько значений с одним и тем же ключом, это также не очень удобно.
3

Как говорит @Xaerxess в ответ на ваш второй вопрос, вы можете создать свой собственный ListMultimap, который использует LinkedHashMap в качестве базовой карты, используя метод Multimaps.newListMultimap.

Для вашего 1-я вопроса, где у вас есть ключи сопоставляются с несколькими значениями (т.е. Multimap), вы можете использовать метод Multimaps.invertFrom для создания инверсной копии исходного Multimap делать обратные взгляды вверх на.Кроме того, вы можете создать копию оригинала и использовать его метод inverse(), чтобы получить обратный, хотя это просто копирует оригинал, как это делает Multimaps.invertFrom (хотя он будет кэшировать его, поэтому повторные вызовы на inverse() возвращают ту же копию.)

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

+0

Я согласен, 'Multimaps.invertFrom' и' ImmutableXXXMultimap.invert() 'очень полезны. @OP - см. Мой [ответ на другой вопрос с примером кода для 'ImmultableListMultimap.invert()'] (http://stackoverflow.com/a/8439744/708434). – Xaerxess

+0

@ColinD, Спасибо. Я хочу решить эту проблему http://stackoverflow.com/questions/9661374/java-hash-table-issue-with-object-refference. Поэтому я считаю, что заменить все «foo» на один «foo», а затем обратный поиск (для Key-Multiple Value Map) или получить ключ от позиции, который сэкономит место (для карты с множественным значением ключа). Однако, кажется, из ваших Ans, я должен был потратить много места, чем раньше. Есть ли решение Guava по http://stackoverflow.com/questions/9661374/java-hash-table-issue-with-object-refference. Благодарю. – Arpssss

+0

@Arpssss: Я боюсь, что это действительно непонятно для меня как в этом вопросе, так и в том, что вы на самом деле хотите сделать, поэтому я не уверен, что смогу вам помочь. В другом вопросе мне кажется, что вы беспокоитесь о том, что вы, возможно, не должны беспокоиться, но я снова не могу сказать без каких-либо подробностей. – ColinD

Смежные вопросы