zoukankan      html  css  js  c++  java
  • java学习之treeset

    Set:无序,不可以重复元素

      |--HashSet:数据结构是哈希表,线程是非同步的。

              保证元素唯一性的原理:判断元素的hashcode值是否相同

                如果相同,还会继续判断元素的equals方法,是否为true

      |--TreeSet:可以对Set集合中的元素进行排序。

            底层数据结构是二叉树。

            保证元素唯一性的依据:compareTo方法return 0

        

                TreeSet排序的第一种方式:让元素自身具备比较性。

                        元素需要实现Compareable接口,覆盖compareTo方法。

                        这种方式也称为元素的自然顺序,或者叫做默认顺序。

            第二种方式:当元素自身不具备比较性时,或具备的比较性不是所需要的,

                  就需要集合自身具备比较性。定义比较器,将比较器对象作为参数

                  传递给TreeSet集合的构造函数。

            当两种方式都存在时以比较器为主。

    注意:排序时,当主要条件相同时,一定要判断一下次要条件(否则会被认为是同一个对象而不被加入)

     1 import java.util.Iterator;
     2 import java.util.TreeSet;
     3 
     4 /**
     5  * 需求:
     6  * 往treeset集合中存储自定义对象学生  
     7  * 想按照学生的年龄进行排序
     8  */
     9 public class PackageDemo {
    10 
    11     public static void main(String[] args) {
    12         TreeSet ts=new TreeSet();
    13         ts.add(new Student("皮卡丘1",20));
    14         ts.add(new Student("皮卡丘",20));
    15         ts.add(new Student("皮卡",19));
    16         ts.add(new Student("雷卡",21));
    17         ts.add(new Student("雷卡",21));
    18         
    19         Iterator it=ts.iterator();
    20         
    21         while(it.hasNext()) {
    22             Student student=(Student)it.next();
    23             System.out.println(student.getName()+"...."+student.getAge());
    24         }
    25         
    26     }
    27 
    28 }
    29 class Student implements Comparable{//该接口强制让学生具有比较性
    30     private String name;
    31     private int age;
    32     public Student(String name,int age) {
    33         this.name=name;
    34         this.age=age;
    35     }
    36     public String getName() {
    37         return name;
    38     }
    39     public int getAge() {
    40         return age;
    41     }
    42     @Override
    43     public int compareTo(Object o) {
    44         if(null == o) {
    45             throw new RuntimeException("传进一个空对象");
    46         }
    47         if(!(o instanceof Student)) {
    48             throw new RuntimeException("传进来的不是学生类");
    49         }
    50         Student student=(Student)o;
    51         if(this.age>student.age) {
    52             return 1; 
    53         }else if(this.age==student.age) {
    54             return this.name.compareTo(student.name);//注意:排序时,当主要条件相同时,一定要判断一下次要条件(否则会被认为是同一个对象而不被加入)
    55         }
    56         return -1;
    57     }
    58     
    59     
    60 }
     1 import java.util.Iterator;
     2 import java.util.TreeSet;
     3 
     4 /**
     5  * 需求:
     6  * 往treeset集合中存储自定义对象学生  
     7  * 想按照学生的年龄进行排序
     8  * 
     9  * 需求变更:
    10  * 要求获得的顺序和添加的一致
    11  * 方法:利用二叉树特性和从小到大取值的特性,仅需使返回值恒为1:public int compareTo(Object o) {
    12         return 1;
    13     }
    14     
    15     同理可得:是返回值恒为0,则不会添加任何的数据,因为被认为是相同的对象而不会加入二叉树
    16  * 
    17  */
    18 public class PackageDemo {
    19 
    20     public static void main(String[] args) {
    21         TreeSet ts=new TreeSet();
    22         ts.add(new Student("皮卡丘1",20));
    23         ts.add(new Student("皮卡丘",20));
    24         ts.add(new Student("皮卡",19));
    25         ts.add(new Student("雷卡",21));
    26         ts.add(new Student("雷卡",21));
    27         
    28         Iterator it=ts.iterator();
    29         
    30         while(it.hasNext()) {
    31             Student student=(Student)it.next();
    32             System.out.println(student.getName()+"...."+student.getAge());
    33         }
    34         
    35     }
    36 
    37 }
    38 class Student implements Comparable{//该接口强制让学生具有比较性
    39     private String name;
    40     private int age;
    41     public Student(String name,int age) {
    42         this.name=name;
    43         this.age=age;
    44     }
    45     public String getName() {
    46         return name;
    47     }
    48     public int getAge() {
    49         return age;
    50     }
    51     @Override
    52     public int compareTo(Object o) {
    53         return 0;
    54 //        return 1;
    55         /*if(null == o) {
    56             throw new RuntimeException("传进一个空对象");
    57         }
    58         if(!(o instanceof Student)) {
    59             throw new RuntimeException("传进来的不是学生类");
    60         }
    61         Student student=(Student)o;
    62         if(this.age>student.age) {
    63             return 1; 
    64         }else if(this.age==student.age) {
    65             return this.name.compareTo(student.name);
    66         }
    67         return -1;*/
    68     }
    69     
    70     
    71 }
     1 public class TreeSetDemo2 {
     2     public static void main(String[] args) {
     3          TreeSet ts=new TreeSet(new MyCompare());//也可用匿名内部类实现
     4          ts.add(new Student("皮卡丘1",20));
     5          ts.add(new Student("皮卡丘",20));
     6          ts.add(new Student("皮卡",19));
     7          ts.add(new Student("雷卡",21));
     8          ts.add(new Student("雷卡2",21));
     9          
    10          Iterator it=ts.iterator();
    11          while(it.hasNext()) {
    12                 Student student=(Student)it.next();
    13                 System.out.println(student.getName()+"...."+student.getAge());
    14          }
    15     }
    16 }
    17 class Student implements Comparable{
    18     private String name;
    19     private int age;
    20     public Student(String name,int age) {
    21         this.name=name;
    22         this.age=age;
    23     }
    24     public String getName() {
    25         return name;
    26     }
    27     public int getAge() {
    28          return age;
    29     }
    30     public int compareTo(Object o) {
    31         return 1;
    32     }
    33 }
    34 class MyCompare implements Comparator{
    35 
    36     @Override
    37     public int compare(Object o1, Object o2) {
    38         Student s1=(Student)o1;
    39         Student s2=(Student)o2;
    40         int num=s1.getName().compareTo(s2.getName());
    41         if(num==0) {
    42             return new Integer(s1.getAge()).compareTo(s2.getAge());
    43         }
    44         return num;
    45     }
    46     
    47 }
  • 相关阅读:
    2018年蓝桥杯java b组第五题
    2018年蓝桥杯java b组第四题
    2018年蓝桥杯java b组第三题
    2018年蓝桥杯java b组第二题
    2018年蓝桥杯ava b组第一题
    java算法基础范例
    2015年蓝桥杯java b组第十题
    第六届蓝桥杯java b组第8题
    MySQL之数据表(五)
    MySQL数据类型(四)
  • 原文地址:https://www.cnblogs.com/zhaohuan1996/p/8245076.html
Copyright © 2011-2022 走看看