1.sort()函数的基本格式(默认排序为升序排序)
Arrays.sort(int[] a, int fromIndex, int toIndex);Arrays.sort(数组名,起始下标,终止下标);
一个简单的排序例子
import java.util.Arrays;
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc= new Scanner(System.in);
int n=sc.nextInt();
int[] a= new int[10001];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
Arrays.sort(a,0,n);
for(int i=0;i<n;i++){
if(i==n-1){
System.out.println(a[i]);
}
else{
System.out.print(a[i]+" ");
}
}
}
}
2.如果一个数组初始化时已经赋值。则sort函数可以另外一种格式
Arrays.sort(数组名);
ex:
import java.util.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num[]= {5,4,3,2,1};
Arrays.sort(num);
for(int i=0;i<5;i++)
{
System.out.println(num[i]);
}
}
}
cmp函数的格式: int compare(Object o1, Object o2);
我们可以看到,传入函数的是java中的类(java中没有结构体)
这时,sort函数的格式变为: Arrays.sort(数组名, 起始下标, 终止下标, new cmp());
怎么自定义排序呢?
基本方法
int compare(Object o1, Object o2) 返回一个基本类型的整型
如果要按照升序排序,
则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数)
如果要按照降序排序
则o1 小于o2,返回1(正数),相等返回0,01大于02返回-1(负数)
举个例子。-----输入n个数,然后降序排序。
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class shu{
int x;
}
class cmp implements Comparator<shu>{
public int compare(shu a,shu b){
if(a.x<b.x){
return 1;
}
else if(a.x>b.x){
return -1;
}
else{
return 0;
}
//可以简化成
//return b.x-a.x
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
shu num[] = new shu[100];
for(int i=0;i<n;i++){
num[i]=new shu(); ///这个地方容易漏
num[i].x=sc.nextInt();
}
Arrays.sort(num,0,n,new cmp());
for(int i=0;i<n;i++){
if(i==n-1){
System.out.println(num[i].x);
}
else{
System.out.print(num[i].x+" ");
}
}
sc.close();
}
}
下面是一个变式,大体意思是输入一个字符串(名字),接着两个整数,可以代表成绩,首先按X排序,若相同,再看y,根据y排序,最后输出名字与两个成绩。
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class shu{
String name;
int x;
int y;
}
class cmp implements Comparator<shu>{
public int compare(shu a,shu b){
if(a.x<b.x){
return 1;
}
else if(a.x>b.x){
return -1;
}
else{
if(b.y>a.y){
return 1;
}
else if(b.y<a.y){
return -1;
}
else{
return 0;
}
}
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
shu num[] = new shu[100];
for(int i=0;i<n;i++){
num[i]=new shu();
num[i].name=sc.next();
num[i].x=sc.nextInt();
num[i].y=sc.nextInt();
}
Arrays.sort(num,0,n,new cmp());
for(int i=0;i<n;i++){
System.out.println(num[i].name+":"+num[i].x+" "+num[i].y);
}
sc.close();
}
}
对名字按字母排序时可以用到的:
import java.text.CollationKey;
import java.text.Collator;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.Locale;
import java.util.Scanner;
class shu{
String name;
int g;
}
class cmp implements Comparator<shu>{
public int compare(shu a,shu b){
if(b.g==a.g){
Collator collator = Collator.getInstance(Locale.ENGLISH);
CollationKey key1 = collator.getCollationKey(a.name);
CollationKey key2=collator.getCollationKey(b.name);
return key1.compareTo(key2);
// int temp=b.name.charAt(0)-a.name.charAt(0);
// return -temp;
}
else return b.g-a.g;
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
shu[] a=new shu[100];
for(int i=0;i<n;i++){
a[i]=new shu();
a[i].name=sc.next();
a[i].g=sc.nextInt();
}
Arrays.sort(a,0,n,new cmp());
for(int i=0;i<n;i++){
System.out.println(a[i].name+";"+a[i].g);
}
}
}
排序重点: