java-sort進行排序

sort排序

在java中,可以使用sort方法快捷的進行排序。

數組的sort排序

  • sort方法時Arrays類中的靜態方法。可以直接利用類名進行調用。

Arrays類中sort的常用方法:

static void sort(type [] a, int fromIndex, int toIndex) 
          對指定數組的指定範圍按數字升序進行排序。 
          type 可以指定爲int,float,double,long,byte等。
          
          a - 要排序的數組
          fromIndex - 要排序的第一個元素的索引(包括)
          toIndex - 要排序的最後一個元素的索引(不包括)

static void sort(type [] a) 
          對指定的 type型數組按數字升序進行排序。 
          默認爲升序排列

for example

import java.util.Arrays;
import java.util.Scanner;

public class test {
	public static void main(String[] args) {
		Scanner scanner= new Scanner(System.in);
		int n = scanner.nextInt();
		long num[] =new long [n];
		for(int i=0;i<n;i++){
			num[i] = scanner.nextLong();
		}
       Arrays.sort(num,0,n);
       for(int i=0;i<n;i++)
    	    System.out.print(num[i]+" ");
	}
}
輸入:
5
1 3 6 2 4

輸出:
1 2 3 4 6 

利用sort函數對自定義對象的數組進行排序

對自定義的對象的數組進行sort排序,一般需要用到Comparable或是Comparator接口。首先在這裏總結一下這兩個接口的區別:

  • Comparable可以認爲是一個內比較器,實現了Comparable接口的類有一個特點,就是這些類是可以和自己比較的,至於具體和另一個實現了Comparable接口的類如何比較,則依賴compareTo方法的實現,compareTo方法也被稱爲自然比較方法。

compareTo方法的返回值是int,有三種情況:
1、比較者大於被比較者(也就是compareTo方法裏面的對象),那麼返回正整數
2、比較者等於被比較者,那麼返回0
3、比較者小於被比較者,那麼返回負整數

for example:
對一些學生根據總分成績排序輸出,總成績相同時,根據語文成績高低排序,如果語文成績也相同時,依次按照數學,英語成績進行排序。

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import javax.swing.plaf.synth.SynthStyle;

//外比較器
class cmp implements Comparator<Student>{
// 比較規則
	@Override
	public int compare(Student o1, Student o2) {
		if(o1.getTotalScore()!=o2.getTotalScore())
			 return o1.getTotalScore()>o2.getTotalScore()?-1:1;
			 else if(o1.getChineseScore()!=o2.getChineseScore())
				 return o1.getChineseScore()>o2.getChineseScore()?-1:1;
				 else if(o1.getMathScore()!=o2.getMathScore())
					 return o1.getMathScore()>o2.getMathScore()?-1:1;
					 else 
						 return o1.getEnglishScore()>o2.getEnglishScore()?-1:1;
	}
	
}
class Student  {
	private String   name ;
	private double totalScore;
	private double chineseScore;
	private double mathScore;
	private double englishScore;
	
//get 和set方法
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getTotalScore() {
		return totalScore;
	}
	public void setTotalScore(double totalScore) {
		this.totalScore = totalScore;
	}
	public double getChineseScore() {
		return chineseScore;
	}
	public void setChineseScore(double chineseScore) {
		this.chineseScore = chineseScore;
	}
	public double getMathScore() {
		return mathScore;
	}
	public void setMathScore(double mathScore) {
		this.mathScore = mathScore;
	}
	public double getEnglishScore() {
		return englishScore;
	}
	public void setEnglishScore(double englishScore) {
		this.englishScore = englishScore;
	}

	public Student(){}
	  public Student(String name ,double chineseScore,double mathScore,double englishScore){
		  this.name =name;
		  this.totalScore=chineseScore+mathScore+englishScore;
		  this.chineseScore =chineseScore;
		  this.mathScore=mathScore;
		  this.englishScore=englishScore;
	  }
	@Override
	public String toString() {	
		return name + "  總分:"+totalScore+" 語文: "+chineseScore+" 數學: "+mathScore+"  英語 :"+englishScore;
	}	
}
public class test {
	public static void main(String[] args) {
	Scanner sc =new Scanner(System.in);
	int n= sc.nextInt();
	  Student stu[] = new Student[n];
      for(int i=0;i<n;i++){
    	  String name;
    	  name =sc.next();
    	  double chineseScore, mathScore, englishScore;
    	  chineseScore =sc.nextDouble();
    	  mathScore =sc.nextDouble();
    	  englishScore =sc.nextDouble();
    	  stu[i] = new Student(name, chineseScore, mathScore, englishScore);
      }
      
       Arrays.sort(stu,new cmp());
       for(int i=0;i<n;i++){
    	   System.out.println(stu[i].toString());
       }
	}
}
輸入:

3
小王 120 110 135
小李 115 135 116
小張 122 126 131

輸出:

小張  總分:379.0 語文: 122.0 數學: 126.0  英語 :131.0
小李  總分:366.0 語文: 115.0 數學: 135.0  英語 :116.0
小王  總分:365.0 語文: 120.0 數學: 110.0  英語 :135.0

當然爲了寫起來方便,外比較器可以這樣寫:

     Arrays.sort(stu,new Comparator<Student>() {

		@Override
		public int compare(Student o1, Student o2) {
			if(o1.getTotalScore()!=o2.getTotalScore())
				 return o1.getTotalScore()>o2.getTotalScore()?-1:1;
				 else if(o1.getChineseScore()!=o2.getChineseScore())
					 return o1.getChineseScore()>o2.getChineseScore()?-1:1;
					 else if(o1.getMathScore()!=o2.getMathScore())
						 return o1.getMathScore()>o2.getMathScore()?-1:1;
						 else 
							 return o1.getEnglishScore()>o2.getEnglishScore()?-1:1;
		    
		}
	});

集合的sort排序

  • 對於常用的vector,list等也可以利用sort進行排序:
    (1)list中的對象已經實現了Comparable接口,說明list中的那種對象是可比較的類型,支持自己和自己比較的,那麼可以直接調用 Collections.sort(list);進行排序。例如常見的Integer,Float,Double類型等。
    (2)如果list中的類沒有實現Comparable接口,則需要藉助外比較器,實現Comparator接口的類的對象

for example
例子和上面實現的相同,只是用的是vector存放student對象,然後排序。

import java.awt.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Vector;

class cmp implements Comparator<Student>{

	@Override
	public int compare(Student o1, Student o2) {
		if(o1.getTotalScore()!=o2.getTotalScore())
			 return o1.getTotalScore()>o2.getTotalScore()?-1:1;
			 else if(o1.getChineseScore()!=o2.getChineseScore())
				 return o1.getChineseScore()>o2.getChineseScore()?-1:1;
				 else if(o1.getMathScore()!=o2.getMathScore())
					 return o1.getMathScore()>o2.getMathScore()?-1:1;
					 else 
						 return o1.getEnglishScore()>o2.getEnglishScore()?-1:1;
	}
	
}
class Student  {
	private String   name ;
	private double totalScore;
	private double chineseScore;
	private double mathScore;
	private double englishScore;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getTotalScore() {
		return totalScore;
	}
	public void setTotalScore(double totalScore) {
		this.totalScore = totalScore;
	}
	public double getChineseScore() {
		return chineseScore;
	}
	public void setChineseScore(double chineseScore) {
		this.chineseScore = chineseScore;
	}
	public double getMathScore() {
		return mathScore;
	}
	public void setMathScore(double mathScore) {
		this.mathScore = mathScore;
	}
	public double getEnglishScore() {
		return englishScore;
	}
	public void setEnglishScore(double englishScore) {
		this.englishScore = englishScore;
	}

	public Student(){}

	  public Student(String name ,double chineseScore,double mathScore,double englishScore){
		  this.name =name;
		  this.totalScore=chineseScore+mathScore+englishScore;
		  this.chineseScore =chineseScore;
		  this.mathScore=mathScore;
		  this.englishScore=englishScore;
	  }

	@Override
	public String toString() {
	
		return name + "  總分:"+totalScore+" 語文: "+chineseScore+" 數學: "+mathScore+"  英語 :"+englishScore;
	}

	
}
public class test {

	public static void main(String[] args) {
	Scanner sc =new Scanner(System.in);
	int n= sc.nextInt();
	
	
	Vector<Student> vc =new Vector<Student>();
	
      for(int i=0;i<n;i++){
    	  String name;
    	  name =sc.next();
    	  double chineseScore, mathScore, englishScore;
    	  chineseScore =sc.nextDouble();
    	  mathScore =sc.nextDouble();
    	  englishScore =sc.nextDouble();
    	vc.addElement( new Student(name, chineseScore, mathScore, englishScore));
      }
       Collections.sort(vc,new Comparator<Student>() {

		@Override
		public int compare(Student o1, Student o2) {
			if(o1.getTotalScore()!=o2.getTotalScore())
				 return o1.getTotalScore()>o2.getTotalScore()?-1:1;
				 else if(o1.getChineseScore()!=o2.getChineseScore())
					 return o1.getChineseScore()>o2.getChineseScore()?-1:1;
					 else if(o1.getMathScore()!=o2.getMathScore())
						 return o1.getMathScore()>o2.getMathScore()?-1:1;
						 else 
							 return o1.getEnglishScore()>o2.getEnglishScore()?-1:1;
		    
		}
	});
      
       Iterator<Student> iterator = vc.iterator();
       while(iterator.hasNext()){
    	   System.out.println(iterator.next().toString());
       }
     
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章