您的位置:首页 > 编程语言 > Java开发

java 根据对象中的某一项进行排序

2015-07-18 20:17 471 查看
java内部封装了快速排序,用起来非常方便,然后我想用这个排序对类中的某一个字段进行排序,例如根据年龄排序,这样普通的办法就没法实现,然后这个时候需要实现java的比较器Comparator,然后重写其中的方法compare,比较部分的逻辑。下面看代码:

package javaProject;

import java.util.Comparator;
 public class myComprator implements Comparator<StuVo>{

		@Override
		public int compare(StuVo o1, StuVo o2){
			
			double a1=Double.valueOf(o1.getAge());
			double a2=Double.valueOf(o2.getAge());

			
			
			
			return (int) (a1-a2);
			
		}
 }


Stuvo.java的代码:

package javaProject;

public class StuVo {
	private String id;
	private String name;
	private String age;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public StuVo(String id, String name, String age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public StuVo() {
		super();
	}

	
	
}


这就是一个简单的实体类,我要根据年龄排序,所以比较器里面就是对年龄进行减法,如果前面的大于后面的返回的数就大于0,相等就等于0,小于就小于0,然后再下面进行调用就实现了对年龄的排序 调用的时候只要1行代码 Collections.sort(list, new myComprator());

package javaProject;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javaProject.TestComparator.AsComparator;

/**
 * 比较器的一个示例
 * @author 李冉
 *
 */
public class SortExample {

	
	
	
	
	
	public static void main(String[] args) {
		
		List<StuVo> list=new ArrayList<StuVo>();
		
		StuVo stu1=new StuVo("1", "aaa", "15.000001");
		list.add(stu1);
		StuVo stu2=new StuVo("2", "bbb", "10");
		list.add(stu2);
		StuVo stu3=new StuVo("3", "ccc", "16");
		list.add(stu3);
		StuVo stu4=new StuVo("4", "ddd", "15.00000000000000002");
		list.add(stu4);
		StuVo stu5=new StuVo("5", "eee", "1");
		list.add(stu5);
		list.toArray().toString();
		for(StuVo s:list){
			System.out.println(" stuvo : id "+s.getId()+" name "+s.getName()+" age is "+s.getAge());
		}
		//list.set(0, stu2);
		//list.set(1, stu1);
		Collections.sort(list, new myComprator());
		
		System.out.println("------------------------------");
		for(StuVo s:list){
			System.out.println(" stuvo : id "+s.getId()+" name "+s.getName()+" age is "+s.getAge());
		}
		
	}
	
	
//	 public class myComprator implements Comparator<StuVo>{
//
//		@Override
//		public int compare(StuVo o1, StuVo o2){
//			
//			double a1=Double.valueOf(o1.getAge());
//			double a2=Double.valueOf(o2.getAge());
//
//			
//			
//			
//			return (int) (a1-a2);
//			
//		}
//		 
		 
		 
		 
		 
	 }


上面是执行部分的代码

结果:

stuvo : id 1 name aaa age is 15

stuvo : id 2 name bbb age is 10

stuvo : id 3 name ccc age is 16

stuvo : id 4 name ddd age is 15

stuvo : id 5 name eee age is 1

------------------------------

stuvo : id 5 name eee age is 1

stuvo : id 2 name bbb age is 10

stuvo : id 1 name aaa age is 15

stuvo : id 4 name ddd age is 15

stuvo : id 3 name ccc age is 16

但是,有一个问题

当小数点过多的时候结果就会错误,例如:

stuvo : id 1 name aaa age is 15.000001

stuvo : id 2 name bbb age is 10

stuvo : id 3 name ccc age is 16

stuvo : id 4 name ddd age is 15.00000000000000002

stuvo : id 5 name eee age is 1

------------------------------

stuvo : id 5 name eee age is 1

stuvo : id 2 name bbb age is 10

stuvo : id 1 name aaa age is 15.000001

stuvo : id 4 name ddd age is 15.00000000000000002

stuvo : id 3 name ccc age is 16

我的解决办法就是在比较器中给这些数字都乘上一个很大的数,就是扩大相同倍数,把小数点都去掉,这样就OK了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: