开源项目

相关文章

更多

最近更新

更多

Guava Multimap类-映射到多个值

2019-04-23 23:23|来源: 网路

多重映射接口扩展映射,使得其键一次可被映射到多个值。

接口声明

以下是com.google.common.collect.Multimap<K,V>接口的声明:

@GwtCompatible
public interface Multimap<K,V>

接口方法

S.N. 方法及说明
1 Map<K,Collection<V>> asMap()
返回此multimap中的视图,从每个不同的键在键的关联值的非空集合映射。
2 void clear()
将删除所有multimap中的键值对,留下空。
3 boolean containsEntry(Object key, Object value)
返回true如果此多重映射包含至少一个键 - 值对用键键和值value。
4 boolean containsKey(Object key)
返回true,如果这个multimap中至少包含一个键值对的键key。
5 boolean containsValue(Object value)
返回true,如果这个multimap至少包含一个键值对的值值。
6 Collection<Map.Entry<K,V>> entries()
返回包含在此multimap中,为Map.Entry的情况下,所有的键 - 值对的视图集合。
7 boolean equals(Object obj)
比较指定对象与此多重映射是否相等。
8 Collection<V> get(K key)
返回,如果有的话,在这个multimap中键关联的值的视图集合。
9 int hashCode()
返回此多重映射的哈希码。
10 boolean isEmpty()
返回true,如果这个multimap中未包含键 - 值对。
11 Multiset<K> keys()
返回一个视图集合包含从每个键值对这个multimap中的关键,没有折叠重复。
12 Set<K> keySet()
Returns a view collection of all distinct keys contained in this multimap.
13 boolean put(K key, V value)
存储键 - 值对在这个multimap中。
14 boolean putAll(K key, Iterable<? extends V> values)
存储一个键 - 值对在此multimap中的每个值,都使用相同的键 key。
15 boolean putAll(Multimap<? extends K,? extends V> multimap)
存储了所有键 - 值对多重映射在这个multimap中,通过返回 multimap.entries() 的顺序.
16 boolean remove(Object key, Object value)
删除一个键 - 值对用键键,并从该多重映射的值的值,如果这样的存在。
17 Collection<V> removeAll(Object key)
删除与键键关联的所有值。
18 Collection<V> replaceValues(K key, Iterable<? extends V> values)
存储与相同的键值,替换任何现有值的键的集合。
19 int size()
返回此多重映射键 - 值对的数量。
20 Collection<V> values()
返回一个视图集合包含从包含在该multimap中的每个键 - 值对的值,而不发生重复 (so values().size() == size()).

Multimap 示例

使用所选择的任何编辑器创建下面的java程序 C:/> Guava

GuavaTester.java

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

public class GuavaTester {
   public static void main(String args[]){
      GuavaTester tester = new GuavaTester();
      Multimap<String,String> multimap = tester.getMultimap();

      List<String> lowerList = (List<String>)multimap.get("lower");
      System.out.println("Initial lower case list");
      System.out.println(lowerList.toString());
      lowerList.add("f");
      System.out.println("Modified lower case list");
      System.out.println(lowerList.toString());

      List<String> upperList = (List<String>)multimap.get("upper");
      System.out.println("Initial upper case list");
      System.out.println(upperList.toString());
      upperList.remove("D");
      System.out.println("Modified upper case list");
      System.out.println(upperList.toString());

      Map<String, Collection<String>> map = multimap.asMap();
      System.out.println("Multimap as a map");
      for (Map.Entry<String,  Collection<String>> entry : map.entrySet()) {
         String key = entry.getKey();
         Collection<String> value =  multimap.get("lower");
         System.out.println(key + ":" + value);
      }

      System.out.println("Keys of Multimap");
      Set<String> keys =  multimap.keySet();
      for(String key:keys){
         System.out.println(key);
      }

      System.out.println("Values of Multimap");
      Collection<String> values = multimap.values();
      System.out.println(values);
   }	

   private Multimap<String,String> getMultimap(){
      //Map<String, List<String>>
      // lower -> a, b, c, d, e 
      // upper -> A, B, C, D

      Multimap<String,String> multimap = ArrayListMultimap.create();		

      multimap.put("lower", "a");
      multimap.put("lower", "b");
      multimap.put("lower", "c");
      multimap.put("lower", "d");
      multimap.put("lower", "e");

      multimap.put("upper", "A");
      multimap.put("upper", "B");
      multimap.put("upper", "C");
      multimap.put("upper", "D");		
      return multimap;		
   }
}

验证结果

使用javac编译器编译如下类

C:\Guava>javac GuavaTester.java

现在运行GuavaTester看到的结果

C:\Guava>java GuavaTester

看到结果。

Initial lower case list
[a, b, c, d, e]
Modified lower case list
[a, b, c, d, e, f]
Initial upper case list
[A, B, C, D]
Modified upper case list
[A, B, C]
Multimap as a map
upper:[a, b, c, d, e, f]
lower:[a, b, c, d, e, f]
Keys of Multimap
upper
lower
Values of Multimap
[A, B, C, a, b, c, d, e, f]


相关问答

更多

Guava / Google Collections如何向后兼容?(How backward compatible is Guava/Google Collections?)

番石榴贡献者在这里。 番石榴12几乎完全向后兼容谷歌收藏,但有几种方法已经过了18个月的规定贬值期并被删除; 请参阅https://code.google.com/p/guava-libraries/issues/detail?id=836 。 也就是说, 没有人应该继续使用Google收藏夹,我们非常强烈地鼓励您迁移。 Guava contributor here. Guava 12 is almost entirely backward-compatible with Google Colle ...

Guava MultiMap和ConcurrentModificationException(Guava MultiMap and ConcurrentModificationException [duplicate])

在java8中,你也可以使用lambda方法: eventMultiMap.entries().removeIf(genericEventCommandEntry -> genericEventCommandEntry.getValue().equals(command)); In java8 you can also use a lambda approach: eventMultiMap.entries().removeIf(genericEventCommandEntry -> generi ...

番石榴Multimap。(Guava Multimap. Put value both to the end and beginning)

这不是ListMultimap ,而是SetMultimap 。 如果需要ListMultimap ,请使用ArrayListMultimap或LinkedListMultimap 。 This isn't a ListMultimap, it's a SetMultimap. If you want a ListMultimap, use ArrayListMultimap or LinkedListMultimap.

使用table guava for hashbasedTable(Using table guava for hashbasedTable)

番石榴贡献者在这里。 不要使用构造函数,请使用HashBasedTable.create()工厂方法。 (没有参数,或与expectedRows和expectedCellsPerRow 。) 使用table.put("A100", "B100", 5) ,就像使用两个键的Map一样。 Guava contributor here. Don't use the constructor, use the HashBasedTable.create() factory method. (With no ...

如何迭代Guava多重映射以成对打印出值(How can I iterate through a Guava multimap to print out values as pairs)

这个问题有两个部分,现在我明白了,而且您使用Multimaps的事实并不重要。 尝试将问题分解为其组成部分是很有价值的; 当你这样做的时候,问题往往变得更加清晰,甚至变得微不足道。 如何从集合中打印连续的对? 我们需要定义一个函数,它将采用一个集合(这将让我们使用任意多图),并生成您的对: public static <V> List<String> genPairs(Collection<V> col) { List<V> ls = ImmutableList.copyOf(col); ...

来自Scala和Guava的Murmur3的不同结果(Different results from Murmur3 from Scala and Guava)

在我看来,像Scala的hashString将UTF-16 char的成对转换为int与Guava的hashUnencodedChars不同(没有Charset的hashUnencodedChars被重命名为)。 斯卡拉: val data = (str.charAt(i) << 16) + str.charAt(i + 1) 番石榴: int k1 = input.charAt(i - 1) | (input.charAt(i) << 16); 在Guava中,索引i处的char变为int的 ...

从Guava Multimap中的值返回键(Return key from value in Guava Multimap)

Guava为Multimap提供了一种反演方法。 请参见Multimaps.invertFrom 。 如果您不经常需要反演,或者您的multimap很小,这可能对您没问题。 但这种反转是一个昂贵的过程。 您可以通过简单地按照JB Nizet在评论中建议的正向和反向来获得一些效率。 然而,两者都可以是多重映射以允许非唯一性。 Guava supplies an inversion method for Multimap. See Multimaps.invertFrom. This might do ...

Guava ValueGraph的简单示例(Simple example of Guava ValueGraph)

Guava wiki提供了以下使用ValueGraph示例: MutableValueGraph<Integer, Double> weightedGraph = ValueGraphBuilder.directed().build(); weightedGraph.addNode(1); weightedGraph.putEdgeValue(2, 3, 1.5); // also adds nodes 2 and 3 if not already present weightedGraph.p ...

不兼容的库版本selenium / guava(Incompatible library version selenium / guava)

因为你对com.google.guava:guava:23.3 org.seleniumhq.selenium:selenium-java:3.0.1依赖性com.google.guava:guava:23.3使用org.seleniumhq.selenium:selenium-java:3.0.1可能会让你在十字路口。 但是Selenium发行说明清楚地提到了以下番石榴依赖性: Selenium v2.49.0 :Bump guava到19版 Selenium v3.1.0 :需要更新最新的番石 ...

使用guava AbstractScheduledService(Using guava AbstractScheduledService)

AbstractScheduledServiced实现Service 。 Service接口描述了生命周期方法,包括startAsync 。 ServiceState枚举文字包含有关其含义的文档。 处于NEW状态的服务(刚刚创建): 处于此状态的服务处于非活动状态。 它做的工作量极少,占用资源极少。 要使服务执行某些有用的操作,您必须将其转换为RUNNING状态 此状态下的服务正在运行。 这就是为什么你必须在它做任何事之前启动服务的原因。 我还建议不要从构造函数中调用startAsync,而是从创 ...