“社会”中的比较—-TreeSet实现对象自动排序

/**
* 对于人来说,在一个社会上,都会出现各种各样的排名,学校有学习排名,公司有国内排名,世界排名,而这个排名是要社会和他人这个前提下进行
* 如果,脱离了这个大环境,那么就无法跟其他人比了,其实,要说明的就是集合中有排名的情况,而且大都会不自然滴进行,那么java编程中,如何对集合
* 进行排序呢?一般这种情况都采用Set接口的实现TreeSet类来做这个工作,而java编程中已经将它封装好了,这个类有两种排序方式,谓之:自然排序,客户排序
* 先说自然排序,只要放进去的对象遵照某种规则,而这里讲的规则,其实是说,一般情况下,放Integer,String,Double等,它都会自动排序
* 因为排序的原理是这样的,TreeSet首先调用对象的compaerTo()方法来比较集合中对象的大小,然后进行升序排列,这就是自然排序。
* 有必要说下compaerTo()方法,a.compaerTo(b),前大于后者为1,小者为-1,相等为0,而java回自动根据这种返回值进行排序
*/
package com.cbh.collection_test;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* @author cbh java编程网 http://www.haohaoblog.com
*/
public class Man implements Comparable{
//没有实现接口时,对放进去的对象在第二次的时候会报错:ClassCastException
        private String speak;
        private int run;
        Man(String speak,int run)
        {
            this.speak=speak;
            this.run=run;
        }
        public String getSpeak() {
            return speak;
        }
        public void setSpeak(String speak) {
            this.speak = speak;
        }
        public int getRun() {
            return run;
        }
        public void setRun(int run) {
            this.run = run;
        }
        public boolean equals(Object one)
        {
            if(this==one)return true;
            if(!(one instanceof Man))return false;
            final Man man=(Man)one;
            if(this.speak.equals(man.getSpeak())&&this.run==man.getRun())
            {
                return true;
            }
            else return false;
        }
        public int hashCode()
        {
            int code;
            code=(speak==null?0:speak.hashCode());
            code=10*code+run;
            return code;
        }//之前说过了,只有同时覆盖了equals和hashCode方法才能真正实现Set的元素不唯一确定
        public int compareTo(Object o)
        {
            Man man=(Man)o;
            if(this.speak.compareTo(man.getSpeak())>0){return 1;}
            if(this.speak.compareTo(man.getSpeak())<0){return -1;}
            if(this.run>man.getRun()){return 1;}
            if(this.run<man.getRun()){return -1;}
            return 0;
        }//实现Comparable接口,从而让Set能对放入的元素进行确认并排序。此方法为Comparable接口唯一的方法
//这个方法在具体的main函数中不会被对象实例调用,但是java编程中,有这种机制可以自动调用该方法
        public static void main(String[] args) {
            Set<Man> set=new TreeSet<Man>();
            Man man1=new Man("speak1",100);
            Man man2=new Man("speak2",120);
            Man man3=new Man("speak3",150);
            Man man4=new Man("speak4",200);
            set.add(man1);
            set.add(man2);
            set.add(man3);
            set.add(man4);
//            man4.setRun(130);修改放进去的对象的值后,不改变原来的排序,而Man这个类提供了可以修改值的方法,所以,TreeSet不适合
//用来存放可变类的对象及其进行的排序,因为不能对修改后的对象进行重新排序。
            Iterator<Man> it=set.iterator();
            while(it.hasNext())
            {
                Man m=(Man)it.next();
                System.out.println(m.getSpeak()+":"+m.getRun());
            }
            Set<Integer> set1=new TreeSet<Integer>();
            set1.add(1);
            set1.add(4);
            set1.add(2);
            set1.add(3);
            set1.add(8);
            set1.add(6);
//            set1.add("123");自然排序中放入集合需是同类型的对象,而这类对象必须是实现了Comparable接口的,Integer,String,Double等默认实现了这个接口
            Iterator<Integer> it1=set1.iterator();
            while(it1.hasNext())
            {
                System.out.println(it1.next());
            }
        }
}
/**输出的结果是:
speak1:100
speak2:120
speak3:150
speak4:130
1
2
3
4
6
8
*/

/**
* 下面说下,第二种排序,客户排序,主要是实现一个Comparator接口,这个接口只有一个方法:int compare(T o1, T o2);
* 用判断两个对象之间的大小,从而进行排序,为什么叫做客户排序呢?笔者的理解,可能是可以更加客户的需求来改变排序吧!即可以给排序的对象
* 设定特定的类型,其实说到底,这两种方法貌似表现出来的结果都一样
*/
class Kehupaixu implements Comparator<Man>
{

    public int compare(Man o1, Man o2) {
        if(o1.getSpeak().compareTo(o2.getSpeak())<0){return -1;}
        if(o1.getSpeak().compareTo(o2.getSpeak())>0){return 1;}
        return 0;
    }//根据speak变量来排序,实现这个集的排序
    public static void main(String[] args) {
        Set<Man> set=new TreeSet<Man>(new Kehupaixu());
        Man man1=new Man("speak1",100);
        Man man2=new Man("speak7",120);
        Man man3=new Man("speak5",150);
        Man man4=new Man("speak4",130);
        set.add(man1);
        set.add(man2);
        set.add(man3);
        set.add(man4);
        Iterator<Man> it=set.iterator();
        while(it.hasNext())
        {
            Man man=it.next();
            System.out.println(man.getRun()+man.getSpeak());
        }
    }
}

你可能感兴趣的:(编程,Collection,TreeSet)