首页 > 编程语言 >java对自定义类型的两种排序方法(Arrays.sort和Collections.sort)

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

时间:2023-02-07 17:05:47浏览次数:50  
标签:sort java String 自定义 System public Student id out


前言

对普通基本类型的数组或者集合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 + "]";
}

}

 

标签:sort,java,String,自定义,System,public,Student,id,out
From: https://blog.51cto.com/u_14932227/6042464

相关文章

  • java学习笔记
    1.java经典题目练习看旁边的目录分类:​​点这里​​ 2.常用实用类​​JavaFile类​​ ​​java大数类总结​​3.知识点​​java对自定义类型的两种排序方法(Arrays.sort和......
  • Java File类
    Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。File对象代表磁盘中实际存在的文件和目录。通过以下构造方法创......
  • JavaScript 解决 query string 乱码问题?
    在JavaScript中获取URL中的querystring时,如果字符串中含有中文字符或特殊字符,可能会遇到乱码问题。为解决这一问题,可以使用decodeURIComponent()函数对整个query......
  • javaScript BOM - 窗口事件,创建定时器与清除定时器
    1.窗口事件事件描述load等页面内容全部加载完毕,包含页面dom元素,图片,flash,css执行DOMContentLoadedDOM加载完毕,不包含图片,flash,css等就可以执行,加载速度比load......
  • 包机制和JavaDoc
    包机制和JavaDoc包机制为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。包本质就是一个文件夹。一般利用公司域名倒置作为包名。定义包用package,......
  • 使用自定义指令fofo, 让输入框自动聚焦
    使用自定义指令fofo,让输入框自动聚焦判断指令所在的标签importVuefrom'vue'//插件对象(必须有install方法,才可以注入到Vue.use中)exportdefault{instal......
  • 2023无死角java学习必备知识点有哪些?
    前奏与工具:学习路线梳理➾JDK工具➾JDK新特性➾IDEA工具基础语言:java基础➾设计模式➾数据结构与算法数据库与JDBC:MySQL➾JDBCWEB基础:Javaweb(HTML/CSS/JS/Tomcat......
  • Java线程
    Java线程是程序过程中的一个线程实体。JVM允许一个应用并发执行多个线程。HotSpotJVM中的Java线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步......
  • DAY 253 Java transient关键字
    1.transient的作用及使用方法     我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必......
  • 视频直播系统源码,java中Map遍历的三种方式
    视频直播系统源码,java中Map遍历的三种方式一:在for循环中使用entries实现Map的遍历:/***最常见也是大多数情况下用的最多的,一般在键值对都需要使用 */Map<String,String......