zoukankan      html  css  js  c++  java
  • Guava包学习---Sets

    Sets包的内容和上一篇中的Lists没有什么大的区别,里面有些细节可以看一下:

    开始的创建newHashSet()的各个重载方法、newConcurrentHashSet()的重载方法、newTreeSet()、newCopyOnWriteArraySet()等都和Lists中的很相似。Sets中有一个不常用的EnumSet,至少不没太使用过这个集合去做事情。EnumSet是Java枚举类型的泛型容器,它的速度据说比HashSet还要快。如果Sets中的值可枚举,那使用这个应该很不错。上个重载方法看下:

    @GwtCompatible(serializable = true)
      public static <E extends Enum<E>> ImmutableSet<E> immutableEnumSet(
          E anElement, E... otherElements) {
        return ImmutableEnumSet.asImmutable(EnumSet.of(anElement, otherElements));
      }
    
      @GwtCompatible(serializable = true)
      public static <E extends Enum<E>> ImmutableSet<E> immutableEnumSet(Iterable<E> elements) {
        if (elements instanceof ImmutableEnumSet) {
          return (ImmutableEnumSet<E>) elements;
        } else if (elements instanceof Collection) {
          Collection<E> collection = (Collection<E>) elements;
          if (collection.isEmpty()) {
            return ImmutableSet.of();
          } else {
            return ImmutableEnumSet.asImmutable(EnumSet.copyOf(collection));
          }
        } else {
          Iterator<E> itr = elements.iterator();
          if (itr.hasNext()) {
            EnumSet<E> enumSet = EnumSet.of(itr.next());
            Iterators.addAll(enumSet, itr);
            return ImmutableEnumSet.asImmutable(enumSet);
          } else {
            return ImmutableSet.of();
          }
        }
      }
    
      public static <E extends Enum<E>> EnumSet<E> newEnumSet(
          Iterable<E> iterable, Class<E> elementType) {
        EnumSet<E> set = EnumSet.noneOf(elementType);
        Iterables.addAll(set, iterable);
        return set;
      }

    其实还是那点东西,就是把传入的内容转换到一个集合中。

    还有一种确定大小的Set:

      public static <E> HashSet<E> newHashSetWithExpectedSize(int expectedSize) {
        return new HashSet<E>(Maps.capacity(expectedSize));

    合并两个Set:

      public static <E> SetView<E> union(final Set<? extends E> set1, final Set<? extends E> set2) {
        checkNotNull(set1, "set1");
        checkNotNull(set2, "set2");
    //--------````

    找到两个Set的交集:

    public static <E> SetView<E> intersection(final Set<E> set1, final Set<?> set2) {
        checkNotNull(set1, "set1");
        checkNotNull(set2, "set2");
    }

    在A不在B中:

     public static <E> SetView<E> difference(final Set<E> set1, final Set<?> set2) {
        checkNotNull(set1, "set1");
        checkNotNull(set2, "set2");
    }

    在A不在B+在B不在A中:

    public static <E> SetView<E> symmetricDifference(
          final Set<? extends E> set1, final Set<? extends E> set2) {
        checkNotNull(set1, "set1");
        checkNotNull(set2, "set2");
    }

    来个有意思的,传入的是一个回调方法,然后过滤部分值:

    public static <E> Set<E> filter(Set<E> unfiltered, Predicate<? super E> predicate) {
        if (unfiltered instanceof SortedSet) {
          return filter((SortedSet<E>) unfiltered, predicate);
        }
        if (unfiltered instanceof FilteredSet) {
          // Support clear(), removeAll(), and retainAll() when filtering a filtered
          // collection.
          FilteredSet<E> filtered = (FilteredSet<E>) unfiltered;
          Predicate<E> combinedPredicate = Predicates.<E>and(filtered.predicate, predicate);
          return new FilteredSet<E>((Set<E>) filtered.unfiltered, combinedPredicate);
        }
    
        return new FilteredSet<E>(checkNotNull(unfiltered), checkNotNull(predicate));
      }

    求两个Sets的笛卡尔集的,这个玩意儿真的有用?

    * Sets.cartesianProduct(ImmutableList.of(
    * ImmutableSet.of(1, 2),
    * ImmutableSet.of("A", "B", "C")))}</pre>
    *
    * <p>returns a set containing six lists:
    *
    * <ul>
    * <li>{@code ImmutableList.of(1, "A")}
    * <li>{@code ImmutableList.of(1, "B")}
    * <li>{@code ImmutableList.of(1, "C")}
    * <li>{@code ImmutableList.of(2, "A")}
    * <li>{@code ImmutableList.of(2, "B")}
    * <li>{@code ImmutableList.of(2, "C")}

    public static <B> Set<List<B>> cartesianProduct(List<? extends Set<? extends B>> sets) {
        return CartesianSet.create(sets);
      }

    求Set的所有子集:

      @GwtCompatible(serializable = false)
      public static <E> Set<Set<E>> powerSet(Set<E> set) {
        return new PowerSet<E>(set);
      }

    还有其他的一些方法,实在不知道在哪里有用处,就不再看了。接下来来开发中最常用的Maps吧。

  • 相关阅读:
    phalcon—— PHP基础知识(一)
    仿淘宝商品浏览界面, 向上拉查看详情
    linux执行run文件显示cannot execute binary file
    atitit.client连接oracle数据库的方式总结
    LeetCode203:Remove Linked List Elements
    DotNetBar.Bar图标列表的使用
    3509.com 纵横天下虚拟主机,垃圾中的战斗机
    RT-Thread内核之线程调度(三)
    CSDN-Code平台公钥设置
    2014年工作中遇到的20个问题:81-100
  • 原文地址:https://www.cnblogs.com/congsg2016/p/5119066.html
Copyright © 2011-2022 走看看