java 排序接口_java中的排序Comparable接口和Comparator接口

普通的类要实现排序,必须实现Comparable接口,并重写CompareTo()方法。package test;

public class Field implements Comparable {

private String name;

private int age;

public Field() {

}

public Field(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int compareTo(Field o) {

// 先按age排序

if (this.age > o.getAge()) {

return (this.age - o.getAge());

}

if (this.age 

return (this.age - o.getAge());

}

// 按name排序

if (this.name.compareTo(o.getName()) > 0) {

return 1;

}

if (this.name.compareTo(o.getName()) 

return -1;

}

return 0;

}

}

package test;import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class Test2 {

public static void main(String[] args) {

Field f1 = new Field("tony", 11);

Field f2 = new Field("jack", 11);

Field f3 = new Field("tom", 11);

Field f4 = new Field("jason", 44);

List list = new ArrayList();

list.add(f1);

list.add(f3);

list.add(f4);

list.add(f2);

Collections.sort(list);

for (Field o : list) {

System.out.println(o.getAge() + "-->" + o.getName());

}

}

}

Comparator

package com.tianjf;

import java.util.Arrays;

import java.util.Comparator;

public class MyComparator implements Comparator {

@Override

public int compare(Object o1, Object o2) {

return toInt(o1) - toInt(o2);

}

private int toInt(Object o) {

String str = (String) o;

str = str.replaceAll("一", "1");

str = str.replaceAll("二", "2");

str = str.replaceAll("三", "3");

return Integer.parseInt(str);

}

/**

* 测试方法

*/

public static void main(String[] args) {

String[] array = new String[] { "一", "三", "二" };

Arrays.sort(array, new MyComparator());

for (int i = 0; i 

System.out.println(array[i]);

}

}

}

相信在看了代码以后就应该明白些了吧,现在再简单说一下Comparable接口和Comparator接口之间的区别(纯属个人想法)。我觉得Comparable接口的最大作用就在于定义一个自定义的类的比较规则,因为CompareTo方法只有一个参数,另一个参数是this,也就是这个类本身,所以我们可以把它看成是在类的内部定义比较规则,相当于Java开发人员在写String类的时候就应该让它实现Comparable接口。然而,compare方法有两个参数,这两个参数可以是任意类型的,可以是已经定义过的String类型,也可以是自定义的类型。如果是已经定义过的类型,compare方法可以对它的规则进行重新定义,如果是自定义的类型,可以新定义一个规则。

总结:

comparable是支持自比较,而后者是支持外部比较;

comparable&   Comparator    都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作)

而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

也就是说当你需要对一个自定义的类的一个数组或者集合进行比较的时候可以实现Comparable接口,当你需要对一个已有的类的数组或者集合进行比较的时候就一定要实现Comparator接口。另外,这两个接口是支持泛型的,所以我们应该在实现接口的同时定义比较类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值