对于Java中sort()方法的一点拙见
刚开始学java的小白,自己的一点认识,理解的不好希望得到指正
- Arrays.sort()
Arrays.sort()可以直接对基本类型(int、char、double..)数组进行从小到大的排序,也可以对包装类类型(Integer、Character、Double..)进行从小到大排序
char型是按ASCII码排序的,例子如下
public static void main(String[] args) {
char[] a= {'j','c','e','o'};
Arrays.sort(a);
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
c
e
j
o
如果你需要按自定义的规则排序,则需要重写compare()函数
而且只能重写包装类的,不能重写基本类型的。重写compare逆序排列例子如下
public static void main(String[] args) {
Character[] a= {'j','c','e','o'};
Arrays.sort(a, new Comparator<Character>() {
public int compare(Character n1,Character n2)
{
if(n1>n2)
{
return -1;}
else if(n1<n2)
{return 1;}
else return 0;
}
});
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
o
j
e
c
可以看到Comparator<>中,只能写包装类,如果写char就会报错。
- Collections.sort()
Collections.sort()是对集合类排序。同样的默认是从大到小排。
如果需要特殊的排序规则,像上面一样用Comparator接口重写compare()函数。
下面给出一个逆序排序的例子
public static void main(String[] args) {
Character[] a= {'j','c','e','o'};
ArrayList<Character> list=new ArrayList<Character>();
for(int i=0;i<a.length;i++)
{
list.add(a[i]);
}
Collections.sort(list,new Comparator<Character>() {
public int compare(Character c1,Character c2)
{
if(c1>c2)
return -1;
else if(c1<c2) return 1;
else return 0;
}
});
for(int i=0;i<a.length;i++)
{
System.out.println(list.get(i));
}
}
o
j
e
c
好了 有人要问了 如果用基本类(int 、char)怎么办。
这里可以用Object类型替换,再在compare函数里强制转换为基本类型。
下面给一个题目作为例子
题目
读入n条学生成绩记录,包括学生姓名,总成绩,语文,数学和英语成绩,要求按总成绩从高到低输出n条记录,每条记录占一行。总成绩相同时按语文成绩从高到低输出,语文成绩相同时按数学成绩从高到低输出。(没有两个人的成绩完全一样)
输入:
第一行读入一个 n ( 0<n<=100) 接下来n行每行读入学生姓名,总成绩,语文,数学和英语成绩,中间以空格隔开
输出:
n行按要求排序好的记录。
样例输入
3 Lsx 270 90 90 90 Ywz 275 92 93 90 Wjx 255 85 85 85
样例输出
Ywz 275 92 93 90 Lsx 270 90 90 90 Wjx 255 85 85 85
AC代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.Comparator;
class student{
public String name;
public int score_math;
public int score_english;
public int score_language;
public int score_sum;
}
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
ArrayList<student> list=new ArrayList<student>();
int n=scan.nextInt();
String input_n;
int input_language;
int input_math;
int input_english;
int input_sum;
for(int i=0;i<n;i++)
{
student s1=new student();
input_n=scan.next();
input_sum=scan.nextInt();
input_language=scan.nextInt();
input_math=scan.nextInt();
input_english=scan.nextInt();
s1.name=input_n;
s1.score_language=input_language;
s1.score_math=input_math;
s1.score_english=input_english;
s1.score_sum=input_sum;
list.add(s1);
}
Collections.sort(list,new Comparator<Object>() {
public int compare(Object a,Object b)
{
student s1=(student)a;
student s2=(student)b;
if(s1.score_sum>s2.score_sum)
return -1;
else if(s1.score_sum<s2.score_sum)
return 1;
else{
if(s1.score_language>s2.score_language)
return -1;
else if(s1.score_language>s2.score_language)
return 1;
else {
if(s1.score_math>s2.score_math)
return -1;
else if(s1.score_math>s2.score_math)
return 1;
else
return 0;
}
}
}
});
for(int i=0;i<list.size();i++)
{
System.out.println(list.get(i).name+" "+list.get(i).score_sum
+" "+list.get(i).score_language+" "+list.get(i).score_math
+" "+list.get(i).score_english);
}
}
}