zoukankan      html  css  js  c++  java
  • java Set(集合)

    set不保存重复的元素(至于如何判断元素相同则较为复杂,后面将会看到).Set中最常被使用的是测试归属表,你可以很容易地询问某个对象是否在某个Set中,正因如此,查找就成了Set最重要的操作,因此通常会选择一个HashSet的实现,它专门对快速查找进行了优化.

    set具有与Collection完全一样的接口,因此没有额外的功能,实际上set就是Collection,只是行为不同.(这是继承与多态思想的典型应用:表现不同的行为.)Set是基于对象的值来确定归属性的,

    通用set类型: HashSet LinkedHashSet

    java Set类

    package java.util;
    public interface Set<E> extends Collection<E> {
        int size();                //输出集合大小
       boolean isEmpty();         //判空
       boolean contains(Object o);//检查集合中是否包含对象o
       Iterator<E> iterator(); //迭代器
       Object[] toArray();
       <T> T[] toArray(T[] a);
        boolean add(E e);       //添加一个元素e
       boolean remove(Object o); //移除对象o
       boolean containsAll(Collection<?> c); //检查集合中是否包含集合C的所有元素
        boolean addAll(Collection<? extends E> c); //添加集合c的所有元素
        boolean retainAll(Collection<?> c);        //保留本集合和集合c的差集
        boolean removeAll(Collection<?> c);       //移除集合中和集合c相同的元素
       void clear();  //清除所有element
       boolean equals(Object o);  //当hashCode()方法返回的哈希码有重复时,调用Object方法
       int hashCode(); //添加元素时,首先调用本方法返回哈希码,如果没重复则添加到集合,否则调用equals()方法返回的哈希码有重复时
                       //哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上
       @Override
        default Spliterator<E> spliterator() {  //splitable iterator可分割迭代器
            return Spliterators.spliterator(this, Spliterator.DISTINCT);
        }
    }

    HashSet示例

    //一个HashSet的示例
    //
    : holding/SetOfInteger.java package object; import java.util.*; public class SetOfInteger { public static void main(String[] args) { Random rand = new Random(new Date().getTime()); Set<Integer> intset = new HashSet<Integer>(); for(int i = 0; i < 10000; i++) intset.add(rand.nextInt(30)); System.out.println(intset);//0~29之间的数出现了10000次但每一个数只有一个出现在结果中 } } /* Output: [15, 8, 23, 16, 7, 22, 9, 21, 6, 1, 29, 14, 24, 4, 19, 26, 11, 18, 3, 12, 27, 17, 2, 13, 28, 20, 25, 10, 5, 0] *///:~

    由于出于速度的原因HashSet使用了散列.HashSet的维护与TreeSet或LinkedSet都不同,因为它们的实现具有不同的元素存储方式,TreeSet将元素存储在红--黑树数据结构中,而HashSet使用了散列函数,LinkedSet出于速度原因也使用了散列,但看起来它使用了链表来维护元素的插入顺序

    用HashSet一般没有规律可循,如果相对结果排序可以使用TreeSet代替HashSet

    能产生每个元素都唯一的列表是相当有用的功能,例如,要找出SetOperatoration.java文件中所有的单词的时候,通过编程思想的net.mindview.TextFile工具,可以打开一个文件,并将其放入Set中:

    //: holding/UniqueWords.java
    package object;
    import java.util.*;
    //import net.mindview.util.*;
    
    public class UniqueWords {
      public static void main(String[] args) {
        Set<String> words = new TreeSet<String>(
          new TextFile("src/object/SetOperations.java", "\W+"));//"\W+"为正则表达式,表示"一个或多个字母"
    //TreeSet是按字典排序的,因此大小字母和小写字母被放到了不同的组中
    System.out.println(words); } } /* Output: [A, B, C, Collections, D, E, F, G, H, HashSet, I, J, K, L, M, N, Output, Print, Set, SetOperations, String, X, Y, Z, add, addAll, added, args, class, contains, containsAll, false, from, holding, import, in, java, main, mindview, net, new, print, public, remove, removeAll, removed, set1, set2, split, static, to, true, util, void] *///:~

    如果想按照字母顺序排序,那么可以向TreeSet的构造其中传入String.CASE_INSENTIVE_ORDER比较器(比较器是建立排序顺序的对象)

    //: holding/UniqueWordsAlphabetic.java
    // Producing an alphabetic listing.
    package object;
    import java.util.*;
    //import net.mindview.util.*;
    
    public class UniqueWordsAlphabetic {
      public static void main(String[] args) {
        Set<String> words =
          new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);//CASE_INSENSITIVE_ORDER比较器(比较器是建立排序顺序的对象
        words.addAll(
          new TextFile("src/object/SetOperations.java", "\W+"));
        System.out.println(words);
      }
    } /* Output:
    [A, add, addAll, added, args, B, C, class, Collections, contains, containsAll, D, E, F, false, from, G, H, HashSet, holding, I, import, in, J, java, K, L, M, main, mindview, N, net, new, Output, Print, public, remove, removeAll, removed, Set, set1, set2, SetOperations, split, static, String, to, true, util, void, X, Y, Z]
    *///:~
  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/jiangfeilong/p/10261452.html
Copyright © 2011-2022 走看看