输入正整数数组,数组所有整数拼接起来排成一个数,打印最小的,例如:{3,32,321}则打印3
个数能排成的最小数为321323
package org.lanqiao.algo.elementary._03sort;
import java.util.Arrays;
import java.util.Comparator;
public class Case11_MinCombineNum {
public static void main(String[] args) {
int res = f(new Integer[]{3, 32, 321});
System.out.println(res);
}
private static int f(Integer[] arr) {
//自定义比较规则
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
String s1 = o1 + "" + o2;
String s2 = o2 + "" + o1;
return s1.compareTo(s2);
}
});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
}
return Integer.parseInt(sb.toString());
}
}
再例如:
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class first{
static int n;
static Node a[] = new Node[n];
static void init(){
for(int i = 0;i<n;i++){
a[i] = new Node();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
init();
n = sc.nextInt();
for(int i = 0;i<n;i++){
a[i].val =sc.nextInt();
a[i].pos = i;
}
// f(a);
System.out.println( f(a));
// for(int i = 1;i<=n;i++){
// System.out.println(a[i].val);
// }
}
static int f(Node []a){
Arrays.sort(a, new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
if(o1.val>o2.val) {
return 1;
}
return 0;
}
});
StringBuilder sb = new StringBuilder();
for(int i = 0;i<n;i++){
sb.append(a[i].val);
}
return Integer.parseInt(sb.toString());
}
}
class Node{
int val;
int pos;
}
有一篇博文说的是比较器的用法 。注意区分comparable和comparator 的区别 https://blog.csdn.net/weixin_40695725/article/details/86596597
还是比较推荐第二种, 类implements comparable 的那种写法
1.java本身的集合有着Collections.sort
2.数组有Array.sort
3.重写比较器
在集合中,例如List list这种对象,需要要按照student的考试分数排序,可以直接让student类实现comparable接口,重写比较器。或者直接写一个类,里面写比
较器,在sort(list,comparetor)调用,为了节省编写代码时间和行数,也可以使用内部类的方式写比较器,如下
Collections.sort(list, new Comparator<Student>() {
public int compare(Student o1, Student o2) {
return o2.getId() - o1.getId();
};
});
注意,这里的Comparator是一个接口,但是java中允许匿名内部类直接new一个接口,以为匿名内部类没有类名没有构造器,会直接实现接口中的,所以要重写接口的抽象方法,
且方法必须是public的,此外可能还有些其他需要注意的。另,匿名内部类应该也可以new抽象类。