直接开门见山吧。
有很多时候我们要将一些元素存进list中,并且需要根据它的一些属性排序。
这时候我们就有两种方式。
1、继承comparable,重写其中的compareTo方法。
重写compareTo方法时,因为参数为object,所以需要先将object强转成对应的类型。
2、实现Comparator接口,重写public int compare(Object o1, Object o2) 方法。如下:
Collections.sort(list, new Comparator() {
@Override
public int compare(String o1, String o2) {
//此处为判断大小的条件
}
但是当我们知道了这些还是远远不够的,我们更加需要通过很多练习来判断该如何写它的排序条件。虽然有很多题都是只需要根据其中的元素属性直接比较大小就好,但是我认为这还远远不够。
比如说在做剑指offer中的一道名为“把数组排成最小的数” 的算法题时,题目要求使得将数组中的数拼接起来的数字最小。这道题就用到了对list的排序。下面是题目描述。
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
我们会发现不单纯的是对数组中的元素进行比较大小,它要实现的应该是判断数组中每一个元素,在最后拼接成的那个结果中所在的位置。
举个例子
12 2
这两个数字该如何排序使得结果最小?我相信大家都能一眼看出(也可能需要两眼,哈哈)
122。
不知道大家有没有这样的感觉,很多时候我们的大脑反应是足够快的,快到我们不知道我们是如何得出某些结论的。
但是要做题,我们就得搞清楚它背后的逻辑。所以我们就得慢下来。
当我们看到这两个数时,肯定是把122与212进行了比较,那么现在我们就抓住了这个题的“小辫子”。即 当我们需要判断某个元素的位置时,我们需要做的是,将它与每一个元素进行两次拼接(一次在前,一次在后)比较这两次的结果,便能得出这两个数的”相对位置“。
接着我们就是实现comparator并且重写compare了。
Collections.sort(list, new Comparator(){}
那么compare该如何写呢?
首先 需要拼接 ,如下
String s1=str1+""+str2;
String s2=str2+""+str1;
然后就是比较了。比较可以有很多种做法,
下面这种做法就很让我触动。(可能是因为之前只见过对象调用)
return s1.compareTo(s2);
下面是完整的代码。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int [] numbers) {
int n;
String s="";
ArrayList<Integer> list=new ArrayList<Integer>();
n=numbers.length;
for(int i=0;i<n;i++){
list.add(numbers[i]);//将数组放入arrayList中
}
//实现了Comparator接口的compare方法,将集合元素按照compare方法的规则进行排序
Collections.sort(list,new Comparator<Integer>(){
@Override
public int compare(Integer str1, Integer str2) {
// TODO Auto-generated method stub
String s1=str1+""+str2;
String s2=str2+""+str1;
return s1.compareTo(s2);
}
});
for(int j:list){
s+=j;
}
return s;
}
}