zoukankan      html  css  js  c++  java
  • java 深入技术四(Set)

    1)Set接口

    set接口的父接口-Collection

    set接口的重要子类-HashSet

    set接口的重要子类 -TreeSet

    set 接口的特别子类-LinkedHashSet

    2)HashSet

    内部数据结构:哈希表(散列表)

    哈希表的一种典型结构是数组和链表的结合体

    添加:园内的元素上的数字表示哈希值,简单起见,决定元素在数组上的位置,算法:index=hashCode%length;

    元素的hashCode()方法决定元素在数组中位置,元素添加到链表是,会一次和链表的每个元素判断是否相等,如果有相等情况就丢弃,否则,添加到链表的末尾

    1.确定在数组中的位置

    2.判断元素在链表上有没有出现过(equals),hashSet中不能存相同的元素

    删除:remove(obj) 会先根据元素的hashCode方法定位此对象所在数组的索引位置,依次比较次位置链表的每一个元素,如果相等,则把链表中的此元素删除

    特点://元素无序:添加顺序和取出顺序不同
     //不能添加重复的数据
     //可以添加null
     //添加方法效率高

    //删除方法效率高

    /、HashSet 不支持get获取方法,因为没有索引

    3)TreeSet

    内部数据结构:二叉树

    二叉树特点:一个节点最后只有两个子节点左<父>右,没有重复元素

    取出顺序:左-父-右,3,8,10,15,18,20,24(元素在集合中就已排好序)从小到大

    按照终序遍历

    先找根节点左边的节点

    TreeSet的方法和Collection接口的方法一致

    TreeSet集合的元素无序(取出顺序和添加顺序不一致)

                       元素不可重复

                      元素具有排序性

    TreeSet取出元素只能通过迭代器

    TreeSet各种操作的效率分析:

    添加:只需要定位添加位置,效率很快

    删除:只需要定位元素位置,效率很快

    4)Comparable

    TreeSet元素排序规则:

    Comparable接口用来标明元素自身的排序规则,也就是说只有实现此接口才具有比较性,才可以添加到TreeSet中

    java常见类如String ,Integer 等都已实现Comparable接口,都有自己独特的排序规则,但我们定义的类Person由于没有实现Comparable接口,因此不具备排序性(比较性)

    如果我们想按照Person的姓名排序,我们可以实现Comparable接口,实现此接口的comparable方法,在此方法中按照姓名排序的代码

    元素自身所具有的排序规则称为自然排序

    只对TreeSet 有效:添加到TreeSet中的元素实现了Comparable接口,实现CompareTo方法后,自身就具有排序性,自然排序

     5)Comparator比较器

     和元素排序有关的两个接口:Comparable,Comparator

    Comparable要求元素本身实现Comparable接口,本身具有比较性

    public class Person implements Comparable{

    .

    .

    .

    //按照姓名字符串的字典顺序排序
            public int compareTo(Object o){
             //如果返回值等于0,就说明要比较的两个对象相等
             //如果返回小于0的数呢?
             
             if(name==null){
              return 1;
             }
             Person other=(Person)o;
             return name.compareTo(other.getname());
            }

    }

    Comparator元素并不需要实现接口,接口和集合对象相关

    MyComparator mycomparator=new MyComparator();
      TreeSet treeSet=new TreeSet(mycomparator);

    。。。

    //专门用来比较Person对象
    class MyComparator implements Comparator{
     public int compare(Object o1,Object o2){
      Person p1=(Person)o1;
      Person p2=(Person)o2;
      //为了简单起见,不考虑p1,p2为null的情况
      int age1=p1.getage();
      int age2=p2.getage();
      if(age1==age2){
       String name1=p1.getname();
       String name2=p2.getname();
       //String类型本身就具有比较性.name1不为null
       return name1.compareTo(name2);
      }else{
       return age1-age2;
      }
     }

    6)Set接口综述

    特点:元素无序,不可重复

    Set接口没有提供特殊的方法:Collection Set接口,HashSet,TreeSet类方法都是一样

     7)LinkedHashSet

    LinkedHashSet是哈希表和链表的结合体

    结合后的特点:元素有序,元素不可重复,添加删除效率高

    8)Set练习

    1.去除集合中的重复元素

    //1.使用迭代器一个一个添加
    //  Iterator it=list.iterator();
    //  while(it.hasNext()){
    //   Object element=it.next();
    //   set.add(element);
    //   
    //  }
    //  System.out.println(set);
      //2.HashSet 中可以添加一个Collection类的参数
    //  Set set2=new HashSet(list);
    //  System.out.println(set2);
      //3.SetAll(Collection)
      Set set3=new HashSet();

    2.把一个字符串数组中的元素按字符串的长度降序排序,如果长度一样,按照字符串的自然顺序排序

    HashSet set= new HashSet(new Comparator{

    public int compare(Object o1,Object o2){

    String str1=(String)o1;

    String str2=(String)o2;

    if(str1==null){

    return 1;

    }

    if(str2==null){

    return -1;

    }

    int len1=str1.length();

    int len2=str2.length();

    if(len1==len2){

    return len1.compare(len2);

    }else{

    return len1-len2

    }

    }

    })

     3. 简单实现自己的HashSet类-MyHashSet,简单实现add(obj),remove(obj)方法,实现自己的printAllElement()方法,此方法打印出所有的元素(不用实现其他接口)

     1.创建一个LinkedList 数组,在add方法中添加链表,LinkedList linkedList=datas[index];

    2.if(linkedList==null){

    linkedList=new LinkedList();

    data[index]=linkedList();

    }

    Iterator it=linkedList.iterator();

    while(it.hasNext()){

    Object element=it.next();

    if(obj.equals(element)){

    return;

    }

    linkedList.add(obj);

    }

  • 相关阅读:
    word设置的密码忘了怎么办?
    Navicat Report Viewer 设置 HTTP 的方法
    如何处理Navicat Report Viewer 报表
    excel密码忘记了怎么办
    Beyond Compare文本比较搜索功能详解
    Popular Cows POJ
    Problem B. Harvest of Apples HDU
    网络流模型整理
    The Shortest Statement CodeForces
    Vasya and Multisets CodeForces
  • 原文地址:https://www.cnblogs.com/shiyeyeyeye/p/5018972.html
Copyright © 2011-2022 走看看