java对自定义类型的两种排序方法(Arrays.sort和Collections.sort)

前言

对普通基本类型的数组或者集合sort都有相应的排序方法(从小到大),但是对于我们自定义的类型,就需要重新定义比较器,这里介绍对对象数组排序的Arrays.sort和对集合排序的Collections.sort()

自定义排序有两种方法:Comparable 排序接口和Comparator比较器接口,本文主要是第二种做法

Arrays.sort

Arrays.sort(int[] a, int fromIndex, int toIndex)

这是对普通基本类型的数组,a:数组名,fromIndex:开始下标(取得到),toIndex:结束下标(取不到)

对我们自定义的类型,就需要重新定义比较器了

Arrays.sort(G,1,size+1, new MyComprator());
class MyComprator implements Comparator<Student> {//注意Student不能为基本类型
    public int compare(Student t1, Student t2) {
        return t1.id.compareTo(t2.id);//这是对对象数组的String类型进行排序
    }
}

完整代码:

//一个学生类,定义学生集合,实现添加删除排序等功能
import java.util.Scanner;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;
public class Main
{
   public static void main(String args[]) throws Exception
   { 
         Scanner cin=new Scanner(System.in);
          StudentGroup g= new StudentGroup(); 
          g.add();
          g.add();
         
          g.query();
         
          System.out.println("排序后:");
          g.sort();
          g.query();
          
          String t=cin.next();
          g.update(t);
          System.out.println("修改后:");
          g.query();
          
          t=cin.next();
          System.out.println("删除后:");
          g.delete(t);
          g.query();
          
    }
}
class StudentGroup
{
	Student [] G =new Student[101]; 
	static int size=0;
	/*************************添加函数****************************/
	public void add()
	{
		if (size==100)
			System.out.println("通讯录已经满100人,无法继续添加");
		else
		{
			Scanner cin=new Scanner(System.in);
			String id;
			String name;
			String pro;
		    System.out.println("请输入");
		 	System.out.println("学号:");
		 	id = cin.next();
		 	System.out.println("姓名:");
		 	name = cin.next();
		 	System.out.println("专业:");
		 	pro = cin.next();
	    Student s =new Student(id,name,pro);
	 	int flag=0;
	 	for(int i=1;i<=size;i++)
		 {
			 if(G[i].id.equals(s.id))
			 {
				 flag=1;
			 System.out.println("已有学号,不可重复添加");
			 break;
			 }
		 }
	 	if(flag==0)
	 	{
	 	size++;
	 	G[size]=s;
	 	}
		}
	}
	/*************************修改函数****************************/
	public void update(String t)
	{
		int flag=0;
	 for(int i=1;i<=size;i++)
	 {
		 if(G[i].id.equals(t))
		 {
		 flag=1;
		   Scanner cin=new Scanner(System.in);
			String id;
			String name;
			String pro;
			while(true)
		    {
			System.out.println("请输入该学生需要修改的类别(学号,姓名,专业,退出修改)");
		    String s = cin.next();
		    if(s.equals("学号"))
		 	{System.out.println("学号:");
		 	id = cin.next();
		 	G[i].id=id;
		 	}
		    else if(s.equals("姓名"))
		 	{System.out.println("姓名:");
		 	name = cin.next();
		 	G[i].name=name;
		 	}
		    else if(s.equals("专业"))
		 	{System.out.println("专业:");
		 	pro = cin.next();
		 	G[i].pro=pro;
		 	}
		    else if(s.equals("退出修改"))
		    	break;
		    }
		   break;
		 }
	 }
	 if(flag==0)
	 {
		System.out.println("无此人,不可修改"); 
	 }
	 System.out.println("正在退出修改"); 
	}
	/*************************删除函数****************************/
	public void delete(String t)
	{
		int flag=0;
	 for(int i=1;i<=size;i++)
	 {
		 if(G[i].id.equals(t))
		 {
		 flag=1;
	     for(int j=i;j<size;j++)
	     {
	    	 G[j].id=G[j+1].id;
	    	 G[j].name=G[j+1].name;
	    	 G[j].pro=G[j+1].pro;
	     }
	     size--;
		 break;
		 }
	 }
	 if(flag==0)
	 {
		System.out.println("无此人,不可删除"); 
	 }
	 
	}
	/*************************输出函数****************************/
	public void query()
	{
		 for(int i=1;i<=size;i++)
		 {
			 G[i].info();
		 }
	}
	/*************************排序函数****************************/
	public void sort()
	{
		 Arrays.sort(G,1,size+1, new MyComprator());
		 
	}
	
	
}
class Student 
{
	public String id;
	public String name;
	public String pro;
	Student(String a,String b,String c)
	{
	 id=a;
	 name=b;
	 pro=c;
	}
	Student(){
	 
	}
	public void info()
	{
	 System.out.print("学号:"+id);
	 System.out.print("  姓名:"+name);
	 System.out.println("  专业:"+pro);
	}

}
/*************************自定义排序****************************/
class MyComprator implements Comparator<Student> {
    public int compare(Student t1, Student t2) {
        return t1.id.compareTo(t2.id);
    }
}
 

Collections.sort

Collections.sort用与于集合的排序,比如linked,下面给出排序的形式

代码样例

Collections.sort(S, new Comparator<Student>(){
            public int compare(Student stu1, Student stu2) {
                return stu2.getg()-stu1.getg();
                
            }      

完整代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {
	
	@SuppressWarnings("unchecked")
	public static void main(String args[]) throws IOException {

		/*********************读文件*********************/
        FileReader f1 = new FileReader("C:\\Users\\17861\\Desktop\\java\\作业10,12,14素材\\student.txt");
        BufferedReader br=new BufferedReader(f1);
        
    
        List S=new LinkedList<Student>();
        String t=null;
		try {
			while ((t= br.readLine()) != null)
			{
			   String [] s=t.split(" ");
			   int g= Integer.parseInt(s[2]);
			   Student st=new Student(s[0],s[1],g);
			   S.add(st);
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		/*********************排序*********************/
		Collections.sort(S, new Comparator<Student>(){
			public int compare(Student stu1, Student stu2) {
			
				return stu2.getg()-stu1.getg();
				
			}  	
	    });
		
		/*********************写文件*********************/
		FileWriter fw = new FileWriter("C:\\Users\\17861\\Desktop\\java\\作业10,12,14素材\\student.txt");
		BufferedWriter out = new BufferedWriter(fw);
		 try {
			 
			for(int i=0;i<S.size();i++){
				String s=((Student) S.get(i)).getall();
				System.out.println(s);
				
		    	out.write(s);
		    	out.newLine();
		    }
			
			out.close();

		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		  
	
      }
}

class Student {
	String id;
	String name;
	int g;

	public Student(String id, String name, int g) {
		super();
		this.id = id;
		this.name = name;
		this.g = g;
	}

	public int getg() {
		// TODO 自动生成的方法存根
		return this.g;
	}

	Student() {

	}
	public String getall()
	{
		return id+" "+name+" "+g;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", g=" + g + "]";
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值