要实现学生成绩的排序,要从两方面来考虑如何设计程序。
第一方面是选择存储方式
第二方面是选择什么样的排序方式
以下是三种不同类型的实现:
成绩排序功能实现结果如下
采用对象数组的方式来存储学生对象,定义班级类,使用数组来保存班级的学生,代码如下
//使用对象数组存储学生信息,使用冒泡排序算法实现排序
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建班级并实例化
studentclass sclass=new studentclass();
//添加学生
sclass.createclass();
System.out.println("原始顺序:");
//排序前的输出
System.out.println(sclass.output());
sclass.sort();
System.out.println("数组冒泡排序的结果:");
//冒泡排序后的输出
System.out.println(sclass.output());
}
}
class student {
private String name;
private int age;
private double grade;
public student(String name,int age,double grade) {
this.name=name;
this.age=age;
this.grade=grade;
}
//置取方法
public double getGrade() {
return grade;
}
public String getName() {
return name;
}
}
class studentclass {
private student[] stus;
private int size;
public studentclass(){
size=0;
stus=null;
}
//创建班级方法
public void createclass() {
//定义三个数组存放学生的信息
String names[]= {"张三","王五","李四","赵六","孙七"};
double grades[]= {67,78.5,98,76.5,90};
int ages[]= {17,18,18,19,17};
//把name的长度作为数组长度
size=names.length;
//创建班级stus
stus=new student[size];
for(int i=0;i<size;i++) {
stus[i]=new student(names[i],ages[i],grades[i]);
}
}
//排序方法
public void sort() {
student temp;
//冒泡排序
for(int i=0;i<size-1;i++) {
for(int j=1;j<size-i;j++) {
if(stus[j-1].getGrade()>stus[j].getGrade()) {
temp=stus[j-1];
stus[j-1]=stus[j];
stus[j]=temp;
}
}
}
}
//输出方法
public String output() {
//StringBuilder表示可变字符字符串
StringBuilder studentinfo=new StringBuilder();
for(int i=0;i<size;i++) {
//append(方法是创建了一个新的数组,扩大了长度,将需要添加的字符串给复制到这个新的数组中。
studentinfo.append("姓名:"+stus[i].getName()+"\t成绩:"+stus[i].getGrade()+"\r\n");
}
return studentinfo.toString();
}
}
其中output()用到一个类StringBuilder类对象studentinfo的append()方法****来完成字符串的拼接操作。
方法一程序当人数发生变化时,程序的变化也是很大,其次就是程序的实现方法没有充分体现Java语言的特色。
Java语言提供了List接口,list是元素可以重复的线性表。
它的一个具体的实现类是ArrayList,是长度可变的数组,可以对数组中的元素随机访问、插入和删除。
代码如下:
import java.util.List;
import java.util.ArrayList;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
studentclass sclass=new studentclass();
sclass.createclass();
//添加一个学生
sclass.add(new student("杨哥",18,70));
System.out.println("原始顺序:");
System.out.println(sclass.output());
sclass.sort();
System.out.println("数组冒泡排序的结果:");
System.out.println(sclass.output());
}
}
class studentclass {
//用到泛类student,stulist保存班级学生
private List<student> stulist;
private int size;
public studentclass(){
size=0;
stulist=null;
}
public void createclass() {
String names[]= {"张三","王五","李四","赵六","孙七"};
double grades[]= {67,78.5,98,76.5,90};
int ages[]= {17,18,18,19,17};
size=names.length;
//实例化类型为ArrayList
stulist=new ArrayList<student>();
student temp;
for(int i=0;i<size;i++) {
temp=new student(names[i],ages[i],grades[i]);
stulist.add(temp);
}
}
public void sort() {
student temp;
//冒泡排序
for(int i=0;i<size;i++) {
for(int j=1;j<size-i;j++) {
//get获取第几个元素
if(stulist.get(j-1).getGrade()>stulist.get(j).getGrade()) {
temp=stulist.get(j-1);
//set插入当前位置
stulist.set(j-1,stulist.get(j));
stulist.set(j, temp);
}
}
}
}
public void add(student s) {
stulist.add(s);
size=stulist.size();
}
public String output() {
StringBuilder studentinfo=new StringBuilder();
for(student stu:stulist) {
studentinfo.append("姓名:"+stu.getName()+"\t成绩:"+stu.getGrade()+"\r\n");
}
return studentinfo.toString();
}
}
class student {
private String name;
private int age;
private double grade;
public student(String name,int age,double grade) {
this.name=name;
this.age=age;
this.grade=grade;
}
public double getGrade() {
return grade;
}
public String getName() {
return name;
}
}
在createclass方法中,根据班级人数创建班级对象stulist的实例,实例类型为ArrayList,应用ArrayList的方法add()将学生对象添加到班级中。
其中sort排序过程使用到了ArrayList的两个方法
public E get(int index) 获取第index个元素
public E set(int index, E element) 将元素element插入到对象的第index的位置上
其中for(student stu: stulist)就相当于
for(int i=0;i
}
输出结果如图
可以使用Collections类和Comparator接口实现自动排序功能
代码如下:
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
studentclass sclass=new studentclass();
sclass.createclass();
System.out.println("原始顺序:");
System.out.println(sclass.output());
sclass.sort();
System.out.println("数组冒泡排序的结果:");
System.out.println(sclass.output());
}
}
//实现Comparator接口
class studentComparator implements Comparator<student> {
public int compare(student student1,student student2) {
double grade1,grade2;
grade1=student1.getGrade();
grade2=student2.getGrade();
if(grade1>grade2) {
return 1;
}else if(grade1<grade2) {
return -1;}
else {
return 0;
}
}
}
class studentclass {
private List<student> stulist;
private int size;
public studentclass(){
size=0;
stulist=null;
}
public void createclass() {
String names[]= {"张三","王五","李四","赵六","孙七"};
double grades[]= {67,78.5,98,76.5,90};
int ages[]= {17,18,18,19,17};
size=names.length;
stulist=new ArrayList<student>();
student temp;
for(int i=0;i<size;i++) {
temp=new student(names[i],ages[i],grades[i]);
stulist.add(temp);
}
}
public void sort() {
//创建一个比较器类对象sc,使用静态方法sort实现排序
studentComparator sc=new studentComparator();
Collections.sort(stulist,sc);
}
public String output() {
StringBuilder studentinfo=new StringBuilder();
for(student stu:stulist) {
studentinfo.append("姓名:"+stu.getName()+"\t成绩:"+stu.getGrade()+"\r\n");
}
return studentinfo.toString();
}
}
class student {
private String name;
private int age;
private double grade;
public student(String name,int age,double grade) {
this.name=name;
this.age=age;
this.grade=grade;
}
public double getGrade() {
return grade;
}
public String getName() {
return name;
}
}