zoukankan      html  css  js  c++  java
  • TreeSet

    TreeSet实现了SortedSet接口,能够对集合中的对象进行排序 。

    它支持两种排序方式:

    一、自然排序

          使用自然排序时,向TreeSet集合里加入的对象都要实现了Comparable接口(里面的compareTo()方法用于指定排序方式)。

     1 package test.java;
     2 
     3 import java.util.Iterator;
     4 import java.util.Set;
     5 import java.util.TreeSet;
     6 
     7 /**
     8  * Created by Lenovo on 2015/2/10.
     9  */
    10 public class TreeSetTest implements Comparable {
    11 
    12 
    13     public String name;
    14     public int age;
    15 
    16     public TreeSetTest(String name, int age) {    //构造方法没有返回值
    17         this.name = name;
    18         this.age = age;
    19     }
    20     public String getName(){
    21         return this.name;
    22     }
    23     public int getAge(){
    24         return this.age;
    25     }
    26     public boolean equals(Object o) {
    27         if (this == o) return true;
    28         if (!(o instanceof Customer)) {
    29             return false;
    30         }
    31         TreeSetTest other = (TreeSetTest) o;  // 记得!!!
    32         return (this.name.equals(other.getName()) && this.getAge() == other.age);
    33 
    34     }
    35 
    36     public int hashCode() {
    37         int result;
    38         result = (name == null) ? 0 : name.hashCode();
    39         result = 29 * result + age;
    40         return result;
    41     }
    42 
    43     @Override
    44     public int compareTo(Object o) {
    45 
    46         TreeSetTest other = (TreeSetTest) o;
    47         if (this.name.compareTo(other.name) > 0)
    48             return 1;
    49         if (this.name.compareTo(other.name) < 0)
    50             return -1;
    51         if(this.age>other.age)
    52             return 1;
    53         if(this.age<other.age)
    54             return -1;
    55         return 0;
    56     }
    57 
    58     public static void main(String[] args) {
    59         Set<TreeSetTest> set=new TreeSet<TreeSetTest>();
    60         TreeSetTest t1=new TreeSetTest("Tom",15);
    61         TreeSetTest t2=new TreeSetTest("Tom",16);
    62         TreeSetTest t3=new TreeSetTest("Alice",33);
    63 
    64         set.add(t1);
    65         set.add(t2);
    66         set.add(t3);
    67         Iterator<TreeSetTest> it=set.iterator();
    68         while(it.hasNext()) {
    69             TreeSetTest temp = it.next();
    70             System.out.println(temp.name + "  " + temp.age);
    71         }
    72     }
    73 }

            为了保证TreeSetTest能够正确的排序,要求它的compareTo方法和equals方法按相同的规则比较两个对象是否一样,当一个类实现了equals 方法,它的hashCode方法也要实现且保证当两个对象相等时它的哈希码是一样的 。

          对于TreeSet中已经存在的对象,若修改了他们的属性,TreeSet不会对集合重新排序。因此适合用TreeSet进行排序的是不可变类。

    二、客户排序

          客户化排序实现java.util.Comparator<Type> 接口,<Type>指定被排序的对象的类型,里面的compare 方法指定排序的规则。

    Customer类:

     1 package test.java;
     2 
     3 import java.util.Objects;
     4 
     5 public class Customer implements Cloneable{
     6 
     7     private String name;
     8     private  int age;
     9 
    10     public Customer(){
    11         this("unknow",0);  //显示的默认构造方法中 第一个语句必须是this语句。
    12 
    13     }
    14 
    15     public Customer(String name,int age){    //构造方法没有返回值
    16         this.name=name;
    17         this.age=age;
    18     }
    19 
    20     public String getName(){
    21         return this.name;
    22     }
    23 
    24     public int getAge(){
    25         return this.age;
    26     }
    27 
    28     public Object clone()throws CloneNotSupportedException{
    29         return super.clone();
    30     }
    31 
    32     public boolean equals(Object o){
    33         if(this==o) return true;
    34         if(!(o instanceof Customer)){
    35             return false;
    36         }
    37         Customer other= (Customer ) o;  // 记得!!!
    38         return (this.name.equals( other.name)&&this.age==other.age);
    39 
    40     }
    41 
    42     public String toString(){return this.name+"  "+this.age ;}
    43 
    44 
    45 }
    View Code
     1 package test.java;
     2 
     3 import java.util.Comparator;
     4 import java.util.Iterator;
     5 import java.util.Set;
     6 import java.util.TreeSet;
     7 
     8 /**
     9  * Created by Lenovo on 2015/2/10.
    10  */
    11 public class CustomerComparator implements Comparator<Customer> {
    12 
    13 
    14     @Override
    15     public int compare(Customer o1, Customer o2) {
    16         if (o1.getName().compareTo(o2.getName()) > 0) return -1;
    17         if (o1.getName().compareTo(o2.getName()) < 0) return 1;
    18 
    19         if(o1.getAge()<o2.getAge())
    20             return -1;
    21         if(o1.getAge()>o2.getAge())
    22             return 1;
    23         return 0;
    24     }
    25 
    26     public static void main(String[] args) {
    27         Set<Customer> set = new TreeSet<Customer>(new CustomerComparator());
    28         Customer t1 = new Customer("Tom", 15);
    29         Customer t2 = new Customer("Tom", 16);
    30         Customer t3 = new Customer("Alice", 33);
    31 
    32         set.add(t1);
    33         set.add(t2);
    34         set.add(t3);
    35 
    36         Iterator<Customer> it = set.iterator();
    37         while (it.hasNext()) {
    38             Customer temp = it.next();
    39             System.out.println(temp.getName() + " & " + temp.getAge());
    40         }
    41     }
    42 }
  • 相关阅读:
    英式音标
    音标
    JavaWeb中文件的上传和下载
    SpringMVC简单实例(看起来有用)
    C语言指针的初始化和赋值
    VC++ CopyFile函数使用方法
    未将对象引用设置到对象的实例--可能出现的问题总结
    strip 命令的使用方法
    css3 animation动画事件
    CSS中的几个概念--------Day39
  • 原文地址:https://www.cnblogs.com/assult/p/4283904.html
Copyright © 2011-2022 走看看