java之compareto方法的介绍与TreeSet的使用


java中的compareto方法的详细介绍
javacompareTo 
java中的compareto方法,返回参与比较的前后两个字符串的asc码的差值,看下面一组代码
String a="a",b="b";
System.out.println(a.compareto.b);
则输出-1;若a="a",b="a"则输出0;若a="b",b="a"则输出1; 
单个字符这样比较,若字符串比较长呢??
若a="ab",b="b",则输出-1;
若a="abcdef",b="b"则输出-1;也就是说,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值; 

如果首字母相同呢??
若a="ab",b="a",输出1;
若a="abcdef",b="a"输出5;
若a="abcdef",b="abc"输出3;
若a="abcdef",b="ace"输出-1;
即参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值,如果两个字符串不一样长,可以参与比较的字符又完全一样,则返回两个字符串的长度差值 


分两种情况:1、如果这两个字符串不同,compareTo返回这两个字符串在位置k处两个char值的差,即值为this.charAt(k)-anotherString.charAt(k)。
      2、如果没有字符不同的索引位置,则较短字符串的字典顺序在较长字符串之前。在这种情况下,
compareTo返回这两个字符串长度的差,即值为this.length() -anotherString.length()。

 

 1 /*
 2  
 3 TreeSet:它可以给Set集合中的元素进行指定方式的排序。
 4         保证元素唯一性的方式:通过比较的结果是否为0.
 5         底层数据结构是:二叉树。
 6 */
 7  
 8  
 9 import java.util.*;
10  
11  
12 class TreeSetDemo2  
13 {
14     public static void main(String[] args)  
15     {
16         TreeSet ts = new TreeSet();
17  
18         ts.add(new Student("lisi0",30));
19         ts.add(new Student("lisixx",29));
20         ts.add(new Student("lisi9",29));
21         ts.add(new Student("lisi8",38));
22         ts.add(new Student("lisixx",29));
23         ts.add(new Student("lisi4",14));
24         //ts.add(new Student(39));
25         ts.add(new Student("lisi7",27));
26  
27         System.out.println(ts);
28     }
29 }
30  
31 //同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
32 class Student implements Comparable
33 {
34     private int age;
35     private String name;
36     Student(String name,int age)
37     {
38         this.age = age;
39         this.name = name;
40     }
41  
42     public int compareTo(Object obj)
43     {
44         
45         Student stu = (Student)obj;
46         
47         int num = new Integer(this.age).compareTo(new Integer(stu.age));
48  
49         return num==0?this.name.compareTo(stu.name):num;
50  
51         /*
52         if(this.age>stu.age)
53             return 1;
54         if(this.age==stu.age)
55             return this.name.compareTo(stu.name);
56         return -1;
57         */
58         /**/
59     }
60  
61     public int getAge()
62     {
63         return age;
64     }
65     public String toString()
66     {
67         return name+"::"+age;
68     }
69 }
70  

 

  1 /*
  2   
  3  TreeSet:它可以给Set集合中的元素进行指定方式的排序。
  4          保证元素唯一性的方式:通过比较的结果是否为0.
  5          底层数据结构是:二叉树。
  6   
  7          排序的第一种方式:
  8              让元素自身具备比较性。只要让元素实现Comparable接口,覆盖compareTo方法即可。
  9              
 10              但是,如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的。
 11              比如,学生的自然排序是按年龄排序,现在想要按照学生姓名排序。还可以不改动原有代码。
 12              这时怎么办呢?
 13          排序的第二种方式:自定比较器的方式。
 14              这时可以让集合自身具备比较性。
 15              可以定义一个类实现Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数
 16              传递给TreeSet集合构造函数。
 17   
 18              该对象就是比较器。
 19   
 20   
 21   
 22  */
 23   
 24   
 25  import java.util.*;
 26   
 27   
 28  class TreeSetDemo3  
 29  {
 30      public static void main(String[] args)  
 31      {
 32          TreeSet ts = new TreeSet(new StudentComparatorByName());
 33   
 34          ts.add(new Student("lisi0",30));
 35          ts.add(new Student("lisixx",29));
 36          ts.add(new Student("lisi9",29));
 37          ts.add(new Student("lisi8",38));
 38          ts.add(new Student("lisixx",29));
 39          ts.add(new Student("lisi4",14));
 40          //ts.add(new Student(39));
 41          ts.add(new Student("lisi7",27));
 42   
 43   
 44   
 45          System.out.println(ts);
 46      }
 47  }
 48   
 49  class StudentComparatorByName implements Comparator
 50  {
 51      public int compare(Object o1,Object o2)
 52      {
 53          Student s1 = (Student)o1;
 54          Student s2 = (Student)o2;
 55   
 56          int num = s1.getName().compareTo(s2.getName());
 57          return num==0?new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())):num;
 58      }
 59  }
 60   
 61   
 62  //同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
 63  class Student implements Comparable
 64  {
 65      private int age;
 66      private String name;
 67      Student(String name,int age)
 68      {
 69          this.age = age;
 70          this.name = name;
 71      }
 72   
 73      public int compareTo(Object obj)
 74      {
 75          
 76          Student stu = (Student)obj;
 77          
 78          int num = new Integer(this.age).compareTo(new Integer(stu.age));
 79   
 80          return num==0?this.name.compareTo(stu.name):num;
 81   
 82          /*
 83          if(this.age>stu.age)
 84              return 1;
 85          if(this.age==stu.age)
 86              return this.name.compareTo(stu.name);
 87          return -1;
 88          */
 89          /**/
 90      }
 91   
 92      public int getAge()
 93      {
 94          return age;
 95      }
 96      public String getName()
 97      {
 98          return name;
 99      }
100      public String toString()
101      {
102          return name+"::"+age;
103      }
104  }

Integer 类型是一个对象,它也重写了compareTo()方法。直接调用就可以。
int 类型是基本数据类型,如果要比较直接减就可以。

 

推荐:http://blog.csdn.net/you_off3/article/details/7465919

     http://itxiaohu.iteye.com/blog/1600313

posted @ 2015-01-30 14:38  命运丶peng  阅读(4380)  评论(0编辑  收藏  举报