使用guava集合,增加集合的功能

来源:互联网 发布:淘宝限制流量怎么办 编辑:程序博客网 时间:2024/06/10 12:20
Guava引入了很多JDK没有的、但我们发现明显有用的新集合类型。
Multiset

统计一个词在文档中出现了多少次,传统的做法是这样的:(这里举个简单的传统方法,下面不在说明)

[java] view plain copy
  1. @Test  
  2.     public void test20(){  
  3.         List<String> words = new ArrayList<String>();  
  4.         Map<String, Integer> counts = new HashMap<String, Integer>();  
  5.         for (String word : words) {  
  6.             Integer count = counts.get(word);  
  7.             if (count == null) {  
  8.                 counts.put(word, 1);  
  9.             } else {  
  10.                 counts.put(word, count + 1);  
  11.             }  
  12.         }  
  13.     }  

这种写法很笨拙,也容易出错,并且不支持同时收集多种统计信息,如总词数。我们可以做的更好。
Guava提供了一个新集合类型 Multiset,它可以多次添加相等的元素。很好使用例如:

[java] view plain copy
  1. @Test  
  2.     public void test10() {  
  3.         Multiset<String> multiset1 = HashMultiset.create();  
  4.         multiset1.add("a"2);  
  5.         multiset1.add("b");  
  6.         multiset1.add("b");  
  7.         int count = multiset1.count("b");  
  8.         System.out.println(count);  
  9.         Multiset<String> multiset2 = HashMultiset.create();  
  10.         multiset2.add("a"5);  
  11.   
  12.         multiset1.containsAll(multiset2); // 返回true;因为包含了所有不重复元素,  
  13.         // 虽然multiset1实际上包含2个"a",而multiset2包含5个"a"  
  14.         Multisets.containsOccurrences(multiset1, multiset2); // returns false  
  15.         // multiset2.removeOccurrences(multiset1); // multiset2 现在包含3个"a"  
  16.         multiset2.removeAll(multiset1);// multiset2移除所有"a",虽然multiset1只有2个"a"  
  17.         multiset2.isEmpty(); // returns true  
  18.     }  

下面我用测试用例说明一下guava集合类型的新功能

[java] view plain copy
  1. // 在JDK的基础上增加了map的功能  
  2.     @Test  
  3.     public void test8() {  
  4.         Map<String, Integer> left = ImmutableMap.of("a"1"b"2"c"3"d"4);  
  5.         Map<String, Integer> right = ImmutableMap.of("a"2"b"2"c"3);  
  6.         MapDifference<String, Integer> diff = Maps.difference(left, right);  
  7.         System.out.println(diff.entriesDiffering());// 键相同 但是值不相同的映射项  
  8.         System.out.println(diff.entriesInCommon());// 键值都相同的映射项  
  9.         System.out.println(diff.entriesOnlyOnLeft()); // {"a" => 1}  
  10.         System.out.println(diff.entriesOnlyOnRight()); // {"d" => 5}  
  11.     }  
  12.   
  13. // 一个非常有用的集合,取得交集,并集,第一个集合中有的数据第二个集合中没有的数据等方法  
  14.     @Test  
  15.     public void test7() {  
  16.         List<String> list = Lists.newArrayList();  
  17.         // list.  
  18.         Set<String> wordsWithPrimeLength = ImmutableSet.of("one""two""three""six""seven""eight");  
  19.         Set<String> primes = ImmutableSet.of("two""three""five""seven");  
  20.         // primes.add("hello");  
  21.         SetView<String> intersection = Sets.intersection(primes, wordsWithPrimeLength);  
  22.         // intersection包含"two", "three", "seven"  
  23.         ImmutableSet<String> immutableCopy = intersection.immutableCopy();// 可以使用交集,但不可变拷贝的读取效率更高  
  24.         // Sets.difference(set1, set2);  
  25.         SetView<String> difference = Sets.difference(primes, wordsWithPrimeLength);  
  26.         SetView<String> union = Sets.union(primes, wordsWithPrimeLength);  
  27.         System.out.println(union);  
  28.         System.out.println(difference);  
  29.         System.out.println(immutableCopy);  
  30.         Set<String> animals = ImmutableSet.of("gerbil""hamster");  
  31.         Set<String> fruits = ImmutableSet.of("apple""orange""banana");  
  32.   
  33.         Set<List<String>> product = Sets.cartesianProduct(animals, fruits);  
  34.         // {{"gerbil", "apple"}, {"gerbil", "orange"}, {"gerbil", "banana"},  
  35.         // {"hamster", "apple"}, {"hamster", "orange"}, {"hamster", "banana"}}  
  36.   
  37.         Set<Set<String>> animalSets = Sets.powerSet(animals);  
  38.         // {{}, {"gerbil"}, {"hamster"}, {"gerbil", "hamster"}}  
  39.     }  
  40. // 比较器,能够比较数据大小按照自己的要求  
  41.     @Test  
  42.     public void test6() {  
  43.         Ordering<String> order = new Ordering<String>() {  
  44.             @Override  
  45.             public int compare(String left, String right) {  
  46.                 return Ints.compare(left.length(), right.length());  
  47.             }  
  48.         };  
  49.         order.compare("a""b");  
  50.         String min = order.min("a""b1""c11""d111");  
  51.         System.out.println(min);  
  52.     }  
  53.     @Test  
  54.     public void test11() {  
  55.         Multiset<String> multiset = HashMultiset.create();  
  56.         multiset.add("a"3);  
  57.         multiset.add("b"5);  
  58.         multiset.add("c"1);  
  59.         multiset.add("a");  
  60.         multiset.add("a");  
  61.         multiset.add("a");  
  62.         multiset.add("a");  
  63.         ImmutableMultiset<String> highestCountFirst = Multisets.copyHighestCountFirst(multiset);  
  64.         System.out.println(highestCountFirst.elementSet());  
  65.         // highestCountFirst,包括它的entrySet和elementSet,按{"b", "a", "c"}排列元素  
  66.     }  
  67.   
  68.     // 根据特征进行筛选集合中的数据  
  69.     @Test  
  70.     public void test12() {  
  71.         ImmutableSet<String> digits = ImmutableSet.of("zero""one""two""three""four""five""six""seven""eight""nine");  
  72.         Function<String, Integer> lengthFunction = new Function<String, Integer>() {  
  73.             public Integer apply(String string) {  
  74.                 return string.length();  
  75.             }  
  76.         };  
  77.         ImmutableListMultimap<Integer, String> digitsByLength = Multimaps.index(digits, lengthFunction);  
  78.         System.out.println(digitsByLength);  
  79.         /* 
  80.          * digitsByLength maps: 3 => {"one", "two", "six"} 4 => {"zero", "four", 
  81.          * "five", "nine"} 5 => {"three", "seven", "eight"} 
  82.          */  
  83.     }  
  84.   
  85.     @Test  
  86.     public void test13() {  
  87.         ArrayListMultimap<String, Integer> multimap = ArrayListMultimap.create();  
  88.         multimap.putAll("b", Ints.asList(246));  
  89.         multimap.putAll("a", Ints.asList(421));  
  90.         multimap.putAll("c", Ints.asList(253));  
  91.         TreeMultimap<Integer, String> create = TreeMultimap.create();  
  92.         TreeMultimap<Integer, String> inverse = Multimaps.invertFrom(multimap, create);  
  93.         System.out.println(inverse);  
  94.         // 注意我们选择的实现,因为选了TreeMultimap,得到的反转结果是有序的  
  95.         /* 
  96.          * inverse maps: 1 => {"a"} 2 => {"a", "b", "c"} 3 => {"c"} 4 => {"a", 
  97.          * "b"} 5 => {"c"} 6 => {"b"} 
  98.          */  
  99.     }  
  100.     //map中的key和value值进行反转  
  101.     @Test  
  102.     public void test14() {  
  103.         Map<String, Integer> map = ImmutableMap.of("a"1"b"1"c"2);  
  104.         SetMultimap<String, Integer> multimap = Multimaps.forMap(map);  
  105.         // multimap:["a" => {1}, "b" => {1}, "c" => {2}]  
  106.         System.out.println(multimap);  
  107.         HashMultimap<Integer, String> dest = HashMultimap.create();  
  108.         Multimap<Integer, String> inverse = Multimaps.invertFrom(multimap, dest);  
  109.         System.out.println(inverse);  
  110.         // inverse:[1 => {"a","b"}, 2 => {"c"}]  
  111.         /* 
  112.          * Map<String, Integer> map = ImmutableMap.of("a", 1, "b", 1, "c", 2); 
  113.          * SetMultimap<String, Integer> multimap = Multimaps.forMap(map); 
  114.          */  
  115.         // multimap:["a" => {1}, "b" => {1}, "c" => {2}]  
  116.         // Multimap<Integer, String> inverse = Multimaps.invertFrom(multimap,  
  117.         // Multimap<Integer, String>.create());  
  118.         // inverse:[1 => {"a","b"}, 2 => {"c"}]  
  119.     }  
  120.   
  121.     // 多功能的map  
  122.     @Test  
  123.     public void test15() {  
  124.         ArrayListMultimap<String, Integer> multimap = ArrayListMultimap.create();  
  125.         multimap.put("a"1);  
  126.         multimap.put("a"2);  
  127.         System.out.println(multimap);  
  128.         Map<String, Integer> map = new HashMap<String, Integer>();  
  129.         map.put("a"1);  
  130.         map.put("a"2);  
  131.         System.out.println(map);  
  132.         Map<String, Integer> tree = new TreeMap<String, Integer>();  
  133.         tree.put("a"1);  
  134.         tree.put("a"2);  
  135.         System.out.println(tree);  
  136.         Map<String, Integer> table = new Hashtable<String, Integer>();  
  137.         table.put("a"1);  
  138.         table.put("a"2);  
  139.         System.out.println(table);  
  140.         /** 
  141.          * {a=[1, 2]} {a=2} {a=2} {a=2} 
  142.          */  
  143.     }  

原创粉丝点击