java 基础-Comparable和Comparator的用法

Java中Comparable和Comparator的用法

对于自己定义的数据结构,进行排序时,需要我们给予他一定的排序规则,这就涉及到了Java中的两个常用的接口Comparable<T>和Comparator<T>的实现。

Comparable --内部比较器

public interface Comparable<T>

(1) 该接口只有一个int compareTo(T o)方法,compareTo返回值-1、0、1。
(2) 如根据某个类创建的数组或列表(List)需要排序,则该类可以继承 Comparable接口并实现 comparaTo()方法。
(3) 排序写法:
        Arrays.sort(array);
        Collections.sort(list);
(4) 继承了Comparable的类,在用这个类创建TreeSet 和 TreeMap(键)时可以不用指定比较器Comparator。(如果既没有继承Comparable类,也没有指定比较器Compartor则元素加不进去,会报错。在set中的add方法会调用treemap中的put方法。先判断是否有比较器Comparator,在判断是否继承了Comparable)

在TreeSet和TreeMap中的put源码

 public V put(K key, V value) {
        Entry<K,V> t = root;
        if (t == null) {
            compare(key, key); // type (and possibly null) check

            root = new Entry<>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        else {
            if (key == null)
                throw new NullPointerException();
            Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        Entry<K,V> e = new Entry<>(key, value, parent);
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }

在数组、列表、TreeSet 和TreeMap中的应用

package comparable和comparator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.TreeMap;
import java.util.TreeSet;

/**
 * Comparable 内部比较器
 * @author Administrator
 *
 */
public class ComparableTest {
	public static void main(String[] args) {
		//数组
		Student[] stus = {new Student("wendy",21),new Student("Jack",22)};
		Arrays.sort(stus);
		for (Student student : stus) {
			System.out.println(student);
		}
		
		//列表
		List<Student> list = new ArrayList<Student>();
		list.add(new Student("wendy",21));
		list.add(new Student("Jack",23));
		System.out.println(list);
		Collections.sort(list);
		System.out.println(list);
		
		//TreeSet
		TreeSet<Student> tree = new TreeSet<Student>();
		tree.add(new Student("wendy",21));
		tree.add(new Student("jack",23));
		System.out.println(tree);
	
		//TreeMap
		TreeMap<Student,String> map = new TreeMap<>();
		map.put(new Student("jack",23), "1");
		map.put(new Student("wendy",21), "2");
		System.out.println(map);
	}
}

class Student implements Comparable<Student>{
	private String stuName;
	private int age;
	
	public Student(String stuName, int age) {
		super();
		this.stuName = stuName;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [stuName=" + stuName + ", age=" + age + "]";
	}

	@Override
	public int compareTo(Student stu) {
		return this.age - stu.age;
		//return this.stuName.compareTo(stu.stuName);
	}
}

Comparator --外部比较器

public interface Comparator<T> 
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
(1) 该接口有一个int compare(T o,T o2)方法,compare返回值-1、0、1。还有一个equals()方法。
(2) 如根据某个类创建的数组或列表(List)需要排序,如果该类没有继承Comparable接口,则需要自己定义一个继承Comparator的比较器。在TreeSet或者TreeMap(键)中,向集合中添加该类的元素,如果该类没有继承Comparable接口,也需要在创建集合的时候(构造函数中)传入一个Comparator的比较器。
(3) 排序写法:
        Arrays.sort(T[] a, Comparator<? super T> c);
        Collections.sort(List<T> list, Comparator<? super T> c);
        TreeSet(Comparator<? super Work> comparator);
        TreeMap(Comparator<? super Work> comparator);
package comparable和comparator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeMap;
import java.util.TreeSet;

/**
 * Comparator 外部比较器
 * @author Administrator
 *
 */
public class ComparatorTest {
	public static void main(String[] args) {
		//数组
		Work[] works = {new Work("wendy",21),new Work("Jack",23)};
		for (Work work : works) {
			System.out.println(work);
		}
		
		/**
		 * 创建比较器方式一:匿名内部类
		 */
		Arrays.sort(works, new Comparator<Work>(){
			@Override
			public int compare(Work o1, Work o2) {
				return o1.getAge() - o2.getAge();
			}
		});
		
		/**
		 * 创建比较器方式二:自定义一个类继承Comparator
		 */
		Arrays.sort(works, new MyComparator());
		
		for (Work work : works) {
			System.out.println(work);
		}
		
		//list集合
		List<Work> list = new ArrayList<>();
		list.add(new Work("wendy",21));
		list.add(new Work("jack",20));
		Collections.sort(list, new MyComparator());
		System.out.println("list:" + list);
		
		//TreeSet
		TreeSet<Work> set = new TreeSet<>(new MyComparator());
		set.add(new Work("wendy",34));
		set.add(new Work("jack",21));
		System.out.println("set:" + set);
		
		//TreeMap
		TreeMap<Work,String> map = new TreeMap<>(new Comparator<Work>(){
			@Override
			public int compare(Work o1, Work o2) {
				return o1.getAge()-o2.getAge();
			}
		});
		map.put(new Work("wendy",23),"1");
		map.put(new Work("jack",20),"2");
		System.out.println("map:" + map);
	}
}
//自定义比较器
class MyComparator implements Comparator<Work>{
	@Override
	public int compare(Work o1, Work o2) {
		return o1.getStuName().compareTo(o2.getStuName());
	}
}

class Work {
	private String stuName;
	private int age;
	
	public String getStuName() {
		return stuName;
	}

	public int getAge() {
		return age;
	}

	public Work(String stuName, int age) {
		super();
		this.stuName = stuName;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Work [stuName=" + stuName + ", age=" + age + "]";
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,ComparableComparator都是用于进行对象比较的接口。它们的用法如下: 1. Comparable接口 Comparable接口是Java内置的接口,它包含一个方法compareTo(),用于比较对象的大小。实现该接口的类可以直接进行排序。 例如,我们定义一个Person类实现Comparable接口: ``` public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public int compareTo(Person person) { // 按照年龄进行排序 return this.age - person.age; } } ``` 在这个例子中,我们通过实现Comparable接口,并重写compareTo()方法,按照年龄进行排序。 使用Comparable接口进行排序的例子: ``` List<Person> list = new ArrayList<Person>(); list.add(new Person("Tom", 20)); list.add(new Person("Jerry", 18)); list.add(new Person("Jack", 25)); Collections.sort(list); for(Person p : list) { System.out.println(p.getName() + " " + p.getAge()); } ``` 输出结果: ``` Jerry 18 Tom 20 Jack 25 ``` 2. Comparator接口 Comparator接口也是Java内置的接口,它包含一个方法compare(),用于比较两个对象的大小。实现该接口的类可以定制不同的比较规则。 例如,我们定义一个PersonComparator类实现Comparator接口: ``` public class PersonComparator implements Comparator<Person> { public int compare(Person p1, Person p2) { // 按照姓名进行排序 return p1.getName().compareTo(p2.getName()); } } ``` 在这个例子中,我们通过实现Comparator接口,并重写compare()方法,按照姓名进行排序。 使用Comparator接口进行排序的例子: ``` List<Person> list = new ArrayList<Person>(); list.add(new Person("Tom", 20)); list.add(new Person("Jerry", 18)); list.add(new Person("Jack", 25)); Collections.sort(list, new PersonComparator()); for(Person p : list) { System.out.println(p.getName() + " " + p.getAge()); } ``` 输出结果: ``` Jack 25 Jerry 18 Tom 20 ``` 总之,ComparableComparator都是用于对象比较的接口。使用Comparable接口可以方便地对实现该接口的对象进行排序,而使用Comparator接口可以定制不同的比较规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值