zoukankan      html  css  js  c++  java
  • TreeSet集合

    TreeSet集合的特点:

      两种排序方式:

        方式一:让集合中的元素自身具有比较性,这就让加入到TreeSet集合中的对象必须实现comparable接口重写compareTo(Object obj)方法

            这种方式也成为元素的自然排序或默认排序。(但是如果排序的元素不是本人写的,别人写的没有实现comparable接口时想排序使用第二种方式)

        方式二:让集合容器具有比较性,自定义一个比较器实现comparator接口,重写compare(Object o1,Object o2)方法,在初始化TreeSet容器对象将这个

            自定义的比较器作参数传给容器的构造函数,使得集合容器具有比较性,使用这种方式的优先级高于方式一,

    方式一实例:

     1 package com.collection;
     2 
     3 import java.util.Iterator;
     4 import java.util.TreeSet;
     5 
     6 public class TreeSetTest {
     7 
     8     public static void main(String[] args) {
     9         TreeSet<Person> treeSet = new TreeSet<Person>();
    10         treeSet.add(new Person("zhangsan", 12));
    11         treeSet.add(new Person("zhangsan", 16));
    12         treeSet.add(new Person("lisi", 16));
    13         treeSet.add(new Person("wangwu", 20));
    14         treeSet.add(new Person("ada", 20));
    15         Iterator<Person> it = treeSet.iterator();
    16         while(it.hasNext()){
    17             Person p = it.next();
    18             System.out.println(p.toString());
    19         }
    20     }
    21 }
    22 
    23 //集合元素实现comparable接口 重写compareTo()方法
    24 class Person implements Comparable<Person>{
    25 
    26     private String name;
    27     private int age;
    28     
    29     public Person(String name, int age) {
    30         super();
    31         this.name = name;
    32         this.age = age;
    33     }
    34     public String getName() {
    35         return name;
    36     }
    37     public void setName(String name) {
    38         this.name = name;
    39     }
    40     public int getAge() {
    41         return age;
    42     }
    43     public void setAge(int age) {
    44         this.age = age;
    45     }
    46     
    47     @Override
    48     public int compareTo(Person o) {
    49         int result = this.name.compareTo(o.getName());
    50         if(result == 0){
    51             return Integer.valueOf(age).compareTo(new Integer(o.getAge()));
    52         }
    53         return result;
    54     }
    55     
    56     @Override
    57     public String toString() {
    58         return this.name+"---"+this.age;
    59     }
    60     
    61 }
    View Code

    方式二实例:

     1 package com.collection;
     2 
     3 import java.util.Collections;
     4 import java.util.Comparator;
     5 import java.util.Iterator;
     6 import java.util.TreeSet;
     7 
     8 public class TreeSetTest {
     9 
    10     public static void main(String[] args) {
    11         //用Collections.reverseOrder()将比较结果反排列
    12         TreeSet<Person> treeSet = new TreeSet<Person>(Collections.reverseOrder(new MyComparator()));
    13         treeSet.add(new Person("zhangsan", 12));
    14         treeSet.add(new Person("zhangsan", 16));
    15         treeSet.add(new Person("lisi", 16));
    16         treeSet.add(new Person("wangwu", 20));
    17         treeSet.add(new Person("ada", 20));
    18         Iterator<Person> it = treeSet.iterator();
    19         while(it.hasNext()){
    20             Person p = it.next();
    21             System.out.println(p.toString());
    22         }
    23     }
    24 }
    25 
    26 class MyComparator implements Comparator<Person>{
    27 
    28     @Override
    29     public int compare(Person o1, Person o2) {
    30         int result = o1.getName().compareTo(o2.getName());
    31         if(result == 0){
    32             return new Integer(o1.getAge()).compareTo(new Integer(o2.getAge()));
    33         }
    34         return result;
    35     }
    36     
    37 }
    38 
    39 //集合元素实现comparable接口 重写compareTo()方法
    40 class Person implements Comparable<Person>{
    41 
    42     private String name;
    43     private int age;
    44     
    45     public Person(String name, int age) {
    46         super();
    47         this.name = name;
    48         this.age = age;
    49     }
    50     public String getName() {
    51         return name;
    52     }
    53     public void setName(String name) {
    54         this.name = name;
    55     }
    56     public int getAge() {
    57         return age;
    58     }
    59     public void setAge(int age) {
    60         this.age = age;
    61     }
    62     
    63     @Override
    64     public int compareTo(Person o) {
    65         int result = this.name.compareTo(o.getName());
    66         if(result == 0){
    67             return Integer.valueOf(age).compareTo(new Integer(o.getAge()));
    68         }
    69         return result;
    70     }
    71     
    72     @Override
    73     public String toString() {
    74         return this.name+"---"+this.age;
    75     }
    76     
    77 }
    View Code

      排序性:加入到TreeSet集合中的对象必须具有比较性,也就是对象事项comparable接口覆盖compareTo(Object obj)方法,

          判断集合中元素是否相同的标准就是compareTo()中返回值是不是return 0;

          如果只加入一个对象到TreeSet中,无需比 该对象不实现comparable接口也不抱错 但这样就没有意义了

      底层结构:二叉树,由于TreeSet集合底层结构是二叉树,那么compareTo()中返回值return 1时就会按照插入顺序排序,

          相反 return -1,就会按插入的顺序凡序

     1 class MyComparator implements Comparator<Person>{
     2 
     3     @Override
     4     public int compare(Person o1, Person o2) {
     5         
     6         return 1;
     7         //结果
     8         /*zhangsan---12
     9         zhangsan---16
    10         lisi---16
    11         wangwu---20
    12         ada---20*/
    13     }
    14     
    15 }

       唯一性条件:compareTO() return 0;如果相同,则元素不会被加入到集合中....

  • 相关阅读:
    Mysql数据库的一些操作
    【狂神说Java】JavaWeb入门到实战1---笔记
    图神经网络学习
    HWSX网址
    python如何判断两个数组完全相等?
    SQL-3-菜鸟教程
    SQL-2
    时间序列相似度分析算法
    pip install 安装不了怎么办?
    leetcode 3 无重复字符的最长子串
  • 原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4116132.html
Copyright © 2011-2022 走看看