【Java基础】接口Comparable和Comparator的区别和关系

接口Comparable和Comparator的区别和关系

1).两者都是实现集合中元素的比较、排序;

2).Comparable是集合内部定义方法实现排序,Comparator是集合外部实现排序

3).Comparator接口在java.util下,Comparable接口在java.lang下;

  通常自定义类加入如List等容器中能够排序,可以实现Comparable接口,在用Collections.sort(List<T> list, Comparator<? super T> c)排序时,如果不指定Comparator,那么就会按照自然顺序(Comparable的排序方式)进行排序。如API的注释:

  Sorts the specified list according to the order induced by the specified comparator. All elements in the list must be mutually comparable using the specified comparator

  Sorts the specified list into ascending order, according to the <i>natural ordering</i> of its elements

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

  例如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

  常用类如String、Integer可以完成比较大小的操作,其原因就是实现了Comparable接口

package com.pachira.B;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class SortCount {
    private static String TEXT = "data/words.count";
    private static String charset = "gbk";
    public static void main(String[] args) {
        if(args.length < 2){
            System.err.println("Usage: SortCount words.count charset[gbk/utf8]");
            System.exit(-1);
        }
        TEXT = args[0];
        charset = args[1];
        SortCount d = new SortCount();
        d.sort();
    }
    private void sort() {
        try {
            Scanner in = new Scanner(new FileInputStream(TEXT), charset);
            List<Word> words = new ArrayList<Word>();
            while(in.hasNext()){
                String sent = in.nextLine();
                String[] list = sent.split("\t");
                if(list.length >= 2){
                    try {
                        words.add(new SortCount.Word(list[0], Integer.parseInt(list[1])));
                    } catch (Exception e) {
                        continue;
                    }
                }
            }
            in.close();
            Collections.sort(words, new Comparator<Word>() {
                @Override
                public int compare(Word o1, Word o2) {
                    int first = o2.count.compareTo(o1.count);
                    if(first == 0){
                        return o2.name.compareTo(o1.name);
                    }
                    return first;
                }
            });
            for(Word word: words){
                System.out.println(word);
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }
    class Word {
        private String name;
        private Integer count;
        public Word(String name, Integer count) {
            this.name = name;
            this.count = count;
        }
        public String toString() {
            StringBuffer sb = new StringBuffer();
            sb.append(this.name + "\t" + this.count);
            return sb.toString();
        }
    }
}
时间: 2024-10-03 21:53:36

【Java基础】接口Comparable和Comparator的区别和关系的相关文章

Java 解惑:Comparable 和 Comparator 的区别

读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. Comparable 自然排序 Comparable 在 java.lang 包下,是一个接口,内部只有一个方法 compareTo(): public interface Comparable<T> { public int compareTo(T o); } Comparab

Java学习之Comparable与Comparator的区别

Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法.Comparator位于包java.util下,而Comparable位于包   java.lang下Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 Stri

Java中Comparable与Comparator的区别

相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都是Java的接口 区别 Comparator位于java.util包下,而Comparable位于java.lang包下 Comparable接口的实现是在类的内部(如 String.Integer已经实现了Comparable接口,自己就可以完成比较大小操作),Comparator接口的实现是在类

Comparable和Comparator的区别

原文地址:http://leihuang.org/2014/11/16/Comparable-Vs-Comparator/ Comparable和Comparator都是用来实现集合中元素的比较.排序的,只是Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparab

Comparable和Comparator的区别?

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序. Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用: 1.类的没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身 2.可以使用多种排序标准,比如升序.降序等 Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Com

Comparable与Comparator的区别

Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparable位于包   java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 St

Java 集合类(1)--Comparable 和 Comparator的比较

Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序 Comparator位于包java.util下,而Comparable位于包java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口,如 String.Integer 自己就可以完成比较大小操作,已经实现了Comparable接口 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象

java集合中Comparable和Comparator辨析

一.Comparable和Comparator简介 在对集合元素进行比较时一般使用TreeSet.对于简单的数据类型,TreeSet可以直接进行比较.但是对于复杂的数据类型,比如自己定义的数据类型或者类,就需要自己设置比较方法与比较规则了,这时就需要使用Comparable和Comparator. Comparable和Comparator都是用来实现集合中的排序的,只是Comparable是在集合内图定义的方法实现排序,而Comparator是在集合外部实现的排序.所以如果想对结合排序,需要在

Comparable 与 Comparator的区别

Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparable位于包 java.lang下 Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 Stri