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 + " ");
}
}
}