Comparable和Comparator

 

题目:

Comparable和Comparator

Input Output
3
xyz
abc
foo
2 3 1 
6
cloud
algorithms
complexity
development
python
java
2 1 3 4 6 5 

用一般的暴力**方法会超时,因为有两层for循环。附代码如下:

// Don't place your source in a package
import java.util.*;
import java.lang.*;
import java.io.*;

// Please name your class Main
class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    Scanner in = new Scanner(System.in);
		int number = in.nextInt();
		String[] str = new String[number];
		String[] str1 = new String[number];
		for(int i = 0; i < number; i++)
		str[i] = in.next();
		for(int i = 0; i < number; i++)
		str1[i] = str[i];
		Arrays.sort(str1);
		for(int i = 0; i < number; i++){
		    for(int j = 0; j < number; j++){
		        if(str1[i].equals(str[j])){
		            System.out.print(j+1+" ");
		            break;
		        }
		    }
	}
}
}

继续思考发现可以把每个单词封装成一个类,里面有两个变量,一个是字符串words,代表单词本身,一个是索引index,代表原始顺序。对于所有已经封装成类的单词来说,我们只要把这些类按照字符串本身排序,再输出已经排序好的对象的索引值就是答案。这里涉及到了对象的排序,引入了Java中两个重要的接口:Comparable和Comparator。

两者最大的区别是:

Comparable是在要比较的对象的类中implements,这样对象之间就可以用compareTo比较大小,对象的数组就可以调用Arrays.sort()排序。对象的集合就可以调用Collections.sort()排序。

Comparator是要单独实现的,并不在要比较的对象当中implements,要比较两个对象时,就用compare(arg1, arg2),对象的数组可以调用Arrays.sort(arr, 实现Comparator接口的对象)排序。对象的集合就可以调用Collections.sort(arr, 实现Comparator接口的对象)排序。

首先看用Comparable接口实现的代码:

import java.util.Arrays;
import java.util.Scanner;

class node implements Comparable<node>{
	String words;
	int index;
	public int compareTo(node o) {
		return words.compareTo(o.words);
	}
}


public class Main {

    public static void main(String[] args) {
    	Scanner in = new Scanner(System.in);
    	int number = in.nextInt();
    	node[] arr = new node[number];
    	for(int i = 0; i < arr.length; i++) {
    		arr[i] = new node();
    		arr[i].words = in.next();
    		arr[i].index = i + 1;
    	}
    	Arrays.sort(arr);
    	for(int i = 0; i < arr.length; i++) {
    		System.out.print(arr[i].index + " ");
    	}
    }
}

用Comparator接口实现的代码:

import java.util.*;


class node1 {
	String words;
	int index;
	}

class comparator implements Comparator<node1>{
	public int compare(node1 a, node1 b) {
		return a.words.compareTo(b.words);
	}
}

public class Main {

    public static void main(String[] args) {
    	Scanner in = new Scanner(System.in);
    	int number = in.nextInt();
    	node1[] arr = new node1[number];
    	for(int i = 0; i < arr.length; i++) {
    		arr[i] = new node1();
    		arr[i].words = in.next();
    		arr[i].index = i + 1;
    	}
    	comparator com = new comparator();
    	Arrays.sort(arr, com);
    	for(int i = 0; i < arr.length; i++) {
    		System.out.print(arr[i].index + " ");
    	}
    }
}