Comparator和Comparable实现排序的例子源码及其对比
以下内容整理自互联网。最后有可导入eclipse的源码附件。@雪夜丶辉煌 Comparator强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。接口方法:int compare(T o1, T o2);强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。接口方法:public int compareTo(T o);1.Comparator比较的例子Product.javapackage object_sort;
import java.util.Date;
//public class Product implements Comparable {//类内比较
public class Product
{
private String name;
private Date date;
private int price;
public int getPrice()
{
return price;
}
public void setPrice(int price)
{
this.price = price;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
//用于类内比较
//@Override//覆写compareTo(Object o)方法
//public int compareTo(Product o) {
// return -this.date.compareTo(o.date);
//}
}
ProductComparable.javapackage object_sort;
import java.util.Date;
import java.util.Comparator;
public class ProductComparableimplements Comparator<Product>
{
// 对象的排序方式[升、降]
public static boolean sortASC = true;
// 对象的排序属性
public static boolean sortByName = false;
public static boolean sortByDate = false;
public static boolean sortByPrice = false;
@Override
public int compare(Product pro1, Product pro2)
{
int result = 0;
if(sortASC)
{
if(sortByName)
{
String pro1name = pro1.getName();
String pro2name = pro2.getName();
result = pro1name.compareTo(pro2name);
}
else if(sortByDate)
{
Date pro1Date = pro1.getDate();
Date pro2Date = pro2.getDate();
result = pro1Date.compareTo(pro2Date);
}
else if(sortByPrice)
{
Integer pro1Price = pro1.getPrice();
Integer pro2Price = pro2.getPrice();
result = pro1Price.compareTo(pro2Price);
}
}
else
{
if(sortByName)
{
String pro1name = pro1.getName();
String pro2name = pro2.getName();
result =-pro1name.compareTo(pro2name);
}
else if(sortByDate)
{
Date pro1Date = pro1.getDate();
Date pro2Date = pro2.getDate();
result =-pro1Date.compareTo(pro2Date);
}
else if(sortByPrice)
{
Integer pro1Price = pro1.getPrice();
Integer pro2Price = pro2.getPrice();
result =-pro1Price.compareTo(pro2Price);
}
}
return result;
}
}
ProductSort.javapackage object_sort;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
public class ProductSort {
public static void main(String[] args) throws ParseException {
Product pro1 = new Product();
pro1.setName("pro1");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-dd-MM",Locale.CHINA);
pro1.setDate(sdf.parse("2009-03-23"));
pro1.setPrice(89);
Product pro2 = new Product();
pro2.setName("proc2");
pro2.setDate(sdf.parse("2009-02-23"));
pro2.setPrice(45);
Product pro3 = new Product();
pro3.setName("proc3");
pro3.setDate(sdf.parse("2009-01-23"));
pro3.setPrice(83);
Product pro4 = new Product();
pro4.setName("proc4");
pro4.setDate(sdf.parse("2009-01-23"));
pro4.setPrice(800);
List<Product> productList = new ArrayList<Product>();
productList.add(pro1);
productList.add(pro3);
productList.add(pro2);
productList.add(pro4);
System.out.println("排序前————————————————————");
for(Product p: productList){
System.out.println(p.getName()+"----"+p.getPrice()+"----"+p.getDate());
}
ProductComparable sort = new ProductComparable();
ProductComparable.sortASC = false;//降序
ProductComparable.sortByPrice=true;//设置排序属性生效
Collections.sort(productList,sort);
System.out.println("排序后————————————————————");
// for(Iterator<Product>iter = productList.iterator(); iter.hasNext();)
// {
// Product p = (Product)iter.next();
// System.out.println(p.getName()+"----"+p.getPrice()+"---"+p.getDate());
// }
for(Product p: productList){
System.out.println(p.getName()+"----"+p.getPrice()+"----"+p.getDate());
}
}
}
2.Comparable例子Employee.javaimport java.util.Random;
/*
* 因为要实现对Employee对象的排序,所以在Employee类中要实现Comparable接口,
* 也就是要实现comepareTo()方法
*/
public class Employeeimplements Comparable<Employee> {
private int id;
private String name;
private double salary;
public Employee(String n, double s)
{
name = n;
salary = s;
Random ID =new Random();
id = ID.nextInt( 10000000 );
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public void raiseSalary( double byPercent)
{
double raise= salary *byPercent/ 100 ;
salary+=raise;
}
public int compareTo(Employee other)
{
if (id<other.id) //这里比较的是什么 sort方法实现的就是按照此比较的东西从小到大排列
return - 1 ;
if (id>other.id)
return 1 ;
return 0 ;
}
}
EmployeeSortTest.javaimport java.util.Arrays;
public class EmployeeSortTest
{
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee[] staff =new Employee[ 3 ];
staff[ 0 ] =new Employee( "harry Hacker" , 35000 );
staff[ 1 ] =new Employee( "carl cracke" , 75000 );
staff[ 2 ] =new Employee( "tony Tester" , 38000 );
Arrays.sort(staff); //sort方法可以实现对对象数组排序,但是必须实现 Comparable接口
/*Comparable接口原型为:
* public interface Comparable<T>
* {
* int compareTo(T other);//接口的中方法自动属于public方法
* }
*/
for (Employee e: staff)
System.out.println( "id=" +e.getId()+ "name=" +e.getName()+
".salary=" +e.getSalary());
}
}
页:
[1]