java里面的排序

  • Arrays.sort():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()函数(这个和C++一样哒)但是只能重写类的,不能重写基本类型的。重写compare逆序排列,栗子你可以在后面那个谁拿了最多的奖学金那里看到。

Comparator好像有点厉害,现在预习还没看明白,等老师讲了再更新上,先引一个链接吧,点我

  • 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));
    	}
    }

排序的题目:

基础版本:排序后输出最大值(vector::sort实现)

import java.io.*;
import java.util.*;
public class Main
{
    public static void main(String args[])
    {
            Scanner cin=new Scanner(System.in);
            int n=cin.nextInt();
            Integer temp;
            Vector test=new Vector();
            for(int i=1;i<=n;i++)
            {
            	temp=cin.nextInt();
            	test.addElement(temp);
            }
            test.sort(null);
            System.out.println(test.lastElement());

    }
}

进阶版本

描述某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
4) 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
5) 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。
输入输入的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。输出输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。样例输入

4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1

样例输出

ChenRuiyi
9000
28700
import java.io.BufferedInputStream;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Vector;

class student {
    static int moneyAll;
    String name;// 学生姓名
    int no;// 输入顺序编号
    int exam = 0;// 期末平均成绩
    int examClass = 0;// 班级评议成绩
    boolean isS = false;// 是否是学生干部
    boolean isW = false;// 是否是西部省份学生
    int num = 0;// 发表论文数量
    int money = 0;// 获得的奖学金

    void function() {// 判断学生获得多少奖学金
        if (this.exam > 80 && this.num > 0)
            this.money = this.money + 8000;
        if (this.exam > 85 && this.examClass > 80)
            this.money = this.money + 4000;
        if (this.exam > 90)
            this.money = this.money + 2000;
        if (this.isS && this.examClass > 80)
            this.money = this.money + 850;
        if (this.isW && this.exam > 85)
            this.money = this.money + 1000;
        moneyAll = moneyAll + this.money;//计算奖学金的总数
    }
}

public class Main {
    static Comparator<student> com = new Comparator<student>() {
        public int compare(student o1, student o2) {
            int m1 = o1.money;
            int m2 = o2.money;
            if (m1 < m2)
                return 1;
            if (m1 > m2)
                return -1;
            if (m1 == m2) {
                int no1 = o1.no;
                int no2 = o2.no;
                if (no1 < no2)
                    return -1;
                if (no1 > no2)
                    return 1;
            }
            return 0;
        }
    };

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        Vector<student> num = new Vector<>();
        int n = scan.nextInt();

        for (int i = 0; i < n; i++) {
            student s = new student();
            s.no = i;
            s.name = scan.next();
            s.exam = scan.nextInt();
            s.examClass = scan.nextInt();
            if (scan.next().equals("Y"))
                s.isS = true;
            if (scan.next().equals("Y"))
                s.isW = true;
            s.num = scan.nextInt();
            s.function();
            num.add(s);
        }
        Collections.sort(num, com);
        System.out.println(num.get(0).name);
        System.out.println(num.get(0).money);
        System.out.println(student.moneyAll);
    }
}

补充例子:

信息科学技术学院年终评定讲学金,需要对整个年级的学生按照平均分数进行排名.
要求:根据输入的学号和平均成绩,按照平均成绩降序输出学号
如果平均成绩相同,按照输入的顺序输出。输入第一行为N,表示输入N位学生的信息,接着的N行输入学生信息,1<=N<=500
学生信息的格式为:学号 平均成绩
学号的长度小于10,平均成绩在1-100之间.输出按照平均成绩降序输出学号,如果平均成绩相同,按照输入顺序输出样例输入

	5
	10948001 80
	10948004 90
	10948101 95
	10948102 80
	10948209 90

样例输出

	10948101
	10948004
	10948209
	10948001
	10948102

 

import java.io.BufferedInputStream;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Vector;
class student {
    int no;
    int grade;
    int order;
}

public class Main {
    static Comparator<student> com = new Comparator<student>() {
        public int compare(student o1, student o2) {
            int m1 = o1.grade;
            int m2 = o2.grade;
            if (m1 < m2)
                return 1;
            if (m1 > m2)
                return -1;
            if(m1==m2)
            {
            	m1=o1.order;
            	m2=o2.order;
            	if(m1<m2) return -1;
            	else if(m1>m2) return 1;
            	return 0;
            }
            return 0;
        }
    };

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        Vector<student> students = new Vector<>();
        int n = cin.nextInt();
        int t=0;
        for (int i = 0; i < n; i++) {
            student s = new student();
            s.no=cin.nextInt();
            s.grade=cin.nextInt();
            s.order=t++;
            students.add(s);
        }
        Collections.sort(students, com);
        for (int i = 0; i < n; i++)
        	 System.out.println(students.get(i).no);

    }
}

老师的解法:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

class Student{
  String sno;
  int score;
  
  public Student(String sno, int score) {
    super();
    this.sno = sno;
    this.score = score;
  }
  public String getSno() {
    return sno;
  }
  public void setSno(String sno) {
    this.sno = sno;
  }
  public int getScore() {
    return score;
  }
  public void setScore(int score) {
    this.score = score;
  }
  
}
public class Main {	
  
  
public static void main(String[] args)  {

  Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    List<Student> studentList=new ArrayList<Student>();
    for(int i=1;i<=n;i++){
    	studentList.add(new Student(sc.next(),sc.nextInt()));
    }
    Collections.sort(studentList,new Comparator<Student>(){

    @Override
    public int compare(Student o1, Student o2) {
      // TODO Auto-generated method stub
      return o2.getScore()-o1.getScore();
    }	
    });
    for(Student s:studentList){
    	System.out.println(s.getSno());
    }
}
}

字符串排序描述

先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串少于一百个字符。如果在输入过程中输入的一个字符串为“stop”,也结束输入。
然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。
输入字符串的个数,以及该组字符串。每个字符串以‘\n’结束。如果输入字符串为“stop”,也结束输入.输出将输入的所有字符串按长度由小到大排序输出(如果有“stop”,不输出“stop”)。

样例输入

5
sky is grey
cold
very cold
stop
3
it is good enough to be proud of
good
it is quite good

样例输出

cold
very cold
sky is grey
good
it is quite good
it is good enough to be proud of

提示根据输入的字符串个数来动态分配存储空间(采用new()函数)。每个字符串会少于100个字符。
测试数据有多组,注意使用while()循环输入。

 

import java.util.Arrays;
import java.util.Scanner;
import java.util.Comparator;
class  Word{
    String s=new String();
    int len;
   public Word(String s){
        this.s=s;
        this.len=this.s.length();
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext())
        {
          int n = sc.nextInt();
          sc.nextLine();
          int i=0;
          Word[] word = new Word[n];
  
          for (i = 0; i < n; i++) {
          	word[i]=new Word(sc.nextLine());
              if(word[i].s.equals("stop")) {
                  break;
              }

          }
          Arrays.sort(word,0,i, new SortByLength());
          for (int j=0;j<i;j++)
              System.out.println(word[j].s);
        }
    }
    static class SortByLength implements Comparator<Word> {
        public int compare(Word o1, Word o2) {
            return o1.len - o2.len;
        }
    } 
}

 

 

点赞
  1. 匿名说道:
    QQbrowser Android 7.1.2

    哇你好厉害,哇塞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注

4 + 5 =