“社会”中的比较—-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());
}
}
}