文章目录
1.多数组排序 (15 分)
3个整数数组进行整体排序,根据输入的三个数组的元素,输出排序后的结果(从大到小)
输入格式:
第1个数组的长度
第1个数组的各个元素
第2个数组的长度
第2个数组的各个元素
第3个数组的长度
第3个数组的各个元素
输出格式:
所有数组的整体排序
输入样例:
在这里给出一组输入。例如:
3
79 80 61
3
88 66 77
2
23 90
输出样例:
在这里给出相应的输出。例如:
90 88 80 79 77 66 61 23
import java.util.Scanner;
import java.util.Arrays;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int a=sc.nextInt();
int str1[]=new int [a];
for(int i=0 ; i<a; i++){
str1[i]=sc.nextInt();
}
int b= sc.nextInt();
int str2[]=new int [b];
for(int i=0 ; i<b; i++){
str2[i]=sc.nextInt();
}
int c=sc.nextInt();
int str3[]=new int [c];
for(int i=0 ; i<c; i++){
str3[i]=sc.nextInt();
}
int giao[]=new int [a+b+c];
System.arraycopy(str1,0,giao,0,a);
System.arraycopy(str2,0,giao,a,b);
System.arraycopy(str3,0,giao,a+b,c);
Arrays.sort(giao);
System.out.print(giao[giao.length-1]);
for(int i = giao.length-2; i>=0; i--){
System.out.print(" "+giao[i]);
}
}
}
2.jmu-Java-04面向对象进阶–02-接口-Comparator (15 分)
Arrays.sort可以对所有实现Comparable的对象进行排序。但如果有多种排序需求,如有时候需对name进行降序排序,有时候只需要对年龄进行排序。使用Comparable无法满足这样的需求。可以编写不同的Comparator来满足多样的排序需求。
#1.编写PersonSortable2类 属性:private name(String)、private age(int)
有参构造函数:参数为name,age
toString方法:返回格式name-age
#2 编写Comparator类
编写NameComparator类,实现对name进行升序排序
编写AgeComparator类,对age进行升序排序
#3.main方法中
输入n
输入n行name age,并创建n个对象放入数组
对数组按照name进行升序排序后输出。
在3的基础上对数组按照age进行升序排序后输出。
最后最后两行使用如下代码输出NameComparator与AgeComparator所实现的所有接口。
System.out.println(Arrays.toString(NameComparator.class.getInterfaces()));
System.out.println(Arrays.toString(AgeComparator.class.getInterfaces()));
输入样例:
5
zhang 15
zhang 12
wang 14
Wang 17
li 17
输出样例:
NameComparator:sort
Wang-17
li-17
wang-14
zhang-15
zhang-12
AgeComparator:sort
zhang-12
wang-14
zhang-15
Wang-17
li-17
//最后两行是标识信息
import java.util.*;
class PersonSortable2{
private String name;
private int age;
public PersonSortable2(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return name + "-" + age;
}
}
class NameComparator implements Comparator{
@Override
public int compare(Object s1, Object s2) {
return ((PersonSortable2)s1).getName().compareTo(((PersonSortable2)s2).getName());
}
}
class AgeComparator implements Comparator{
@Override
public int compare(Object s1, Object s2) {
return ((PersonSortable2)s1).getAge() - ((PersonSortable2)s2).getAge();
}
}
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Object [] o = new Object[n];
for( int i = 0; i < n; i ++ ){
o[i] = new PersonSortable2(sc.next(), sc.nextInt());
}
Arrays.sort(o, new NameComparator());
System.out.println("NameComparator:sort");
for(Object o1:o){
System.out.println(o1);
}
Arrays.sort(o, new AgeComparator());
System.out.println("AgeComparator:sort");
for(Object o1:o){
System.out.println(o1);
}
System.out.println(Arrays.toString(NameComparator.class.getInterfaces()));
System.out.println(Arrays.toString(AgeComparator.class.getInterfaces()));
sc.close();
}
}
3.职工排序题 (20 分)
1. 为某保险公司设计一个职工管理系统,其中职工类的属性有:职工编号,姓名,性别,团体险业绩,个体险业绩;方法有: 每个属性对应的set,get方法; 不带参数的构造方法; 带参数的构造方法,完成对职工属性的初始化; 该类实现接口Comparable,完成对职工总业绩的比较。
2. 设计一个类,实现Comparator接口,完成对团体险业绩的比较;
3. 在Main类中,创建一个职工的线性表,分别完成对职工线性表按照总业绩升序排序,按照团体险业绩升序排序。 注意:不要设计键盘输入职工信息,可根据样例中提供的数据直接创建职工对象;
输入格式:
输出格式:
各项之间用逗号“,”分隔
输入样例:
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
编号,团险,个险,姓名,性别
1,500,400,职工1,female
3,600,300,职工3,male
2,400,600,职工2,female
4,800,200,职工4,female
5,500,700,职工5,male
编号,团险,个险,姓名,性别
2,400,600,职工2,female
1,500,400,职工1,female
5,500,700,职工5,male
3,600,300,职工3,male
4,800,200,职工4,female
import java.util.*;
public class Main {
public static void main(String[] args) throws InterruptedException {
Scanner sc = new Scanner(System.in);
List<Staff> ss=new ArrayList<Staff>();
ss.add(new Staff(1,500,400,"职工1","female"));
ss.add(new Staff(2,400,600,"职工2","female"));
ss.add(new Staff(3,600,300,"职工3","male"));
ss.add(new Staff(4,800,200,"职工4","female"));
ss.add(new Staff(5,500,700,"职工5","male"));
Collections.sort(ss);
System.out.println("编号,团险,个险,姓名,性别");
for (Staff s:ss){
System.out.println(s.toString());
}
ss.sort(new newComparetor());
System.out.println("编号,团险,个险,姓名,性别");
for (Staff s:ss){
System.out.println(s.toString());
}
}
}
class Staff implements Comparable<Staff>{
private int number;
private int tscore;
private int pscore;
private String name ;
private String sex;
public Staff(int number, int tscore, int pscore, String name, String sex) {
this.number = number;
this.tscore = tscore;
this.pscore = pscore;
this.name = name;
this.sex = sex;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getTscore() {
return tscore;
}
public void setTscore(int tscore) {
this.tscore = tscore;
}
public int getPscore() {
return pscore;
}
public void setPscore(int pscore) {
this.pscore = pscore;
}
@Override
public int compareTo(Staff s) {
int ret=this.pscore+this.tscore-s.getPscore()-s.getTscore();
if (ret>0) ret=1;
else if (ret<0) ret=-1;
return ret;
}
@Override
public String toString() {
return number +
"," + tscore +
"," + pscore +
"," + name +
"," + sex;
}
}
class newComparetor implements Comparator<Staff> {
public newComparetor() {
}
@Override
public int compare(Staff o1, Staff o2) {
int ret=o1.getTscore()-o2.getTscore();
if (ret>0)ret=1;
else if (ret<0)ret=-1;
return ret;
}
}
4.利用集合类排序 (15 分)
借助集合类对输入的n个字符串按照字典序排序。
输入格式:
共有若干行,每行一个字符串,最后一行总是"###"。
输出格式:
按字典序排序好的用空格分隔的一行字符串。
输入样例:
bbb
aaa
abab
aaaa
cabc
输出样例:
在这里给出相应的输出。例如:
aaa aaaa abab bbb cabc
方法一:使用list集合排序,需要用到集合工具类Collections。
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
while(!str.equals("###")) {
list.add(str);
str = sc.nextLine();
}
sc.close();
Collections.sort(list);
for(String temp:list) {
System.out.print(temp+" ");
}
}
}
方法二:利用TreeSet集合可排序的特性,调用其自然排序。
import java.util.Scanner;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<String>();
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
while(!str.equals("###")) {
set.add(str);
str = sc.nextLine();
}
sc.close();
for(String temp:set) {
System.out.print(temp+" ");
}
}
}
5.jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (15 分)
定义Person抽象类,Student类、Company类,Employee类。
Person类的属性:String name, int age, boolean gender
Person类的方法:
public Person(String name, int age, boolean gender);
public String toString(); //返回"name-age-gender"格式的字符串
public boolean equals(Object obj);//比较name、age、gender,都相同返回true,否则返回false
Student类继承自Person,属性:String stuNo, String clazz
Student类的方法:
//建议使用super复用Person类的相关有参构造函数
public Student(String name, int age, boolean gender, String stuNo, String clazz);
public String toString(); //返回 “Student:person的toString-stuNo-clazz”格式的字符串
public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true,则继续比较stuNo与clazz。
Company类属性:String name
Company类方法:
public Company(String name);
public String toString(); //直接返回name
public boolean equals(Object obj);//name相同返回true
Employee类继承自Person,属性:Company company, double salary
Employee类方法:
//建议使用super复用Person类的相关有参构造函数
public Employee(String name, int age, boolean gender, double salary, Company company);
public String toString(); //返回"Employee:person的toString-company-salary"格式的字符串
public boolean equals(Object obj);//首先调用父类的equals方法,如果返回true。再比较company与salary。
//比较salary属性时,使用DecimalFormat df = new DecimalFormat("#.#");保留1位小数
编写equals方法重要说明:
1.对Employee的company属性的比较。要考虑传入为null的情况。如果company不为null且传入为null,返回false
2.对所有String字符类型比较时,也要考虑null情况。
提示
1.排序可使用Collections.sort
2.equals方法要考虑周全
#main方法说明
1.创建若干Student对象、Employee对象。
输入s,然后依次输入name age gender stuNo clazz创建Student对象。
输入e,然后依次输入name age gender salary company创建Employee对象。
然后将创建好的对象放入List personList。输入其他字符,则结束创建。
**创建说明:**对于String类型,如果为null则不创建对象,而赋值为null。对于company属性,如果为null则赋值为null,否则创建相应的Company对象。
2.对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序。提示:可使用Comparable或Comparator
3.接受输入,如果输入为exit则return退出程序,否则继续下面步骤。
4.将personList中的元素按照类型分别放到stuList与empList。注意:不要将两个内容相同的对象放入列表(是否相同是根据equals返回结果进行判定)。
5.输出字符串stuList,然后输出stuList中的每个对象。
6.输出字符串empList,然后输出empList中的每个对象。
1-3为一个测试点 4-6为一个测试点
输入样例:
s zhang 23 false 001 net15
e wang 18 true 3000.51 IBM
s zhang 23 false 001 net15
e bo 25 true 5000.51 IBM
e bo 25 true 5000.52 IBM
e bo 18 true 5000.54 IBM
e tan 25 true 5000.56 IBM
e tan 25 true 5000.51 IBM
s wang 17 false 002 null
s wang 17 false 002 null
e hua 16 false 1000 null
s wang 17 false 002 net16
e hua 16 false 1000 null
e hua 18 false 1234 MicroSoft
!
continue
输出样例:
Employee:bo-18-true-IBM-5000.54
Employee:bo-25-true-IBM-5000.51
Employee:bo-25-true-IBM-5000.52
Employee:hua-16-false-null-1000.0
Employee:hua-16-false-null-1000.0
Employee:hua-18-false-MicroSoft-1234.0
Employee:tan-25-true-IBM-5000.56
Employee:tan-25-true-IBM-5000.51
Student:wang-17-false-002-null
Student:wang-17-false-002-null
Student:wang-17-false-002-net16
Employee:wang-18-true-IBM-3000.51
Student:zhang-23-false-001-net15
Student:zhang-23-false-001-net15
stuList
Student:wang-17-false-002-null
Student:wang-17-false-002-net16
Student:zhang-23-false-001-net15
empList
Employee:bo-18-true-IBM-5000.54
Employee:bo-25-true-IBM-5000.51
Employee:hua-16-false-null-1000.0
Employee:hua-18-false-MicroSoft-1234.0
Employee:tan-25-true-IBM-5000.56
Employee:tan-25-true-IBM-5000.51
Employee:wang-18-true-IBM-3000.51
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
abstract class Person{ //按照题目要求定义抽象类,其实是不是抽象类并不重要
private String name, c;
private int age;
private boolean gender;
public String getName() {
return name;
}
// public void setName(String name) {
// this.name = name;
// }
public String getC() {
return c;
}
// public void setC(String c) {
// this.c = c;
// }
public int getAge() {
return age;
}
// public void setAge() {
// this.age = age;
// }
public boolean isGender() {
return gender;
}
//
// public void setGender(boolean gender) {
// this.gender = gender;
// }
public Person(String c, String name, int age, boolean gender) {
this.c = c;
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return name + "-" + age + "-" + gender;
//返回"name-age-gender"格式的字符串
}
public boolean equals(Object obj) {
Person per = (Person) obj;
//对于String类型,如果为null则不创建对象,而赋值为null。比较name之前应先判断其是否为空。
if(per.name == null || this.name == null)
return false;
return (per.name.compareTo(this.name) == 0 && per.age == this.age && per.gender == this.gender );
//比较name、age、gender,都相同返回true,否则返回false
}
}
class Student extends Person{
private String stuNo;
private String clazz;
// public String getStuNo() {
// return stuNo;
// }
//
// public void setStuNo(String stuNo) {
// this.stuNo = stuNo;
// }
//
// public String getClazz() {
// return clazz;
// }
//
// public void setClazz(String clazz) {
// this.clazz = clazz;
// }
public Student(String c, String name, int age, boolean gender, String stuNo, String clazz) {
super(c, name, age, gender); //用super复用Person类的相关有参构造函数,切记放在首句
this.stuNo = stuNo;
this.clazz = clazz;
}
public String toString(){
return super.toString() + "-" + stuNo + "-" + clazz;
//返回 “Student:person的toString-stuNo-clazz”格式的字符串
}
public boolean equals(Object obj) {
Student per = (Student)obj;
if(super.equals(obj)) {
//首先调用父类的equals方法,如果返回true,则继续比较stuNo与clazz。
if(per.stuNo == null || per.clazz == null || this.stuNo == null || this.clazz == null)
return false;
return (per.stuNo.compareTo(this.stuNo) == 0 && per.clazz.compareTo(this.clazz) == 0);
}
return false;
}
}
class Company{
private String name;
// public String getName() {
// return name;
// }
//
// public void setName(String name) {
// this.name = name;
// }
//
public Company(String name) {
this.name = name;
}
public String toString() { //直接返回name
return name;
}
// @Override
// public int hashCode() {
// final int prime = 31;
// int result = 1;
// result = prime * result + ((name == null) ? 0 : name.hashCode());
// return result;
// }
//右键Source或者Alt+Shift+s;然后选择Generate hashCode() and equals()...(这两个一般要一起用的)
@Override
public boolean equals(Object obj) {
if (this == obj) //如果this和obj指向的内存单元相同,即两个指的就是同一个东西当然要返回true了
return true;
if (obj == null) //如果obj指向空
return false;
if (getClass() != obj.getClass()) //getClass()获得类名,若类都不同那内容肯定也不同了
return false;
Company other = (Company) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true; //name相同返回true
}
}
class Employee extends Person{
private Company company;
private double salary;
// public Company getCompany() {
// return company;
// }
//
// public void setCompany(Company company) {
// this.company = company;
// }
//
// public double getSalary() {
// return salary;
// }
//
// public void setSalary(double salary) {
// this.salary = salary;
// }
public Employee(String c, String name, int age, boolean gender, double salary, Company company) {
super(c, name, age, gender); //使用super复用Person类的相关有参构造函数
this.salary = salary;
this.company = company;
}
@Override
public String toString() {
return super.toString() + "-" + company.toString() + "-" + salary;
//返回"Employee:person的toString-company-salary"格式的字符串
}
@Override
public boolean equals(Object obj) {
if(super.equals(obj)) { //首先调用父类的equals方法,如果返回true。再比较company与salary。
Employee per = (Employee)obj;
if(this.company.toString() == null || per.company.toString() == null)
return false;
//比较salary属性时,使用DecimalFormat df = new DecimalFormat("#.#");保留1位小数
String newpersalary = new DecimalFormat("#.#").format(per.salary);
String newthissalary = new DecimalFormat("#.#").format(this.salary);
return (per.company.toString().compareTo(this.company.toString()) == 0 && newpersalary.compareTo(newthissalary) == 0);
}
return false;
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String c, name, stuNo, clazz, companyname, str;
int age;
boolean gender;
double salary;
ArrayList<Person> personList = new ArrayList<Person>();
ArrayList<Student> studentList = new ArrayList<Student>();
ArrayList<Employee> employeeList = new ArrayList<Employee>();
while(true) {
c = input.next();
if(c.compareTo("s") == 0) {
name = input.next();
age = input.nextInt();
gender = input.nextBoolean();
stuNo = input.next();
clazz = input.next();
Student student = new Student(c, name, age, gender, stuNo, clazz);
personList.add(student);
}
else if(c.compareTo("e") == 0) {
name = input.next();
age = input.nextInt();
gender = input.nextBoolean();
salary = input.nextDouble();
companyname = input.next();
Company company = new Company(companyname);
Employee employee = new Employee(c, name, age, gender, salary, company);
personList.add(employee);
}
else {
personList.sort(Comparator.comparing(Person::getName).thenComparingInt(Person::getAge));
//对personList中的元素实现先按照姓名升序排序,姓名相同再按照年龄升序排序。
for(int i = 0; i < personList.size(); ++i) {
//将personList中元素输出,并将其非重复元素分到studentList和employeeList数组中
if(personList.get(i).getC().compareTo("s") == 0) {
System.out.println("Student:" + personList.get(i).toString());
int flag = 0;
for(int j = 0; j < studentList.size(); ++j) {
if(studentList.get(j).equals(personList.get(i))) {
flag = 1;
break;
}
}
if(flag == 0)
studentList.add((Student)personList.get(i));
}
else if(personList.get(i).getC().compareTo("e") == 0){
System.out.println("Employee:" + personList.get(i).toString());
int flag = 0;
for(int j = 0; j < employeeList.size(); ++j) {
if(employeeList.get(j).equals(personList.get(i))) {
flag = 1;
break;
}
}
if(flag == 0)
employeeList.add((Employee)personList.get(i));
}
}
str = input.next();
//如果输入为exit则return退出程序
if(str.compareTo("exit") == 0 || str.compareTo("return") == 0)
return;
System.out.println("stuList");
for(int i = 0; i < studentList.size(); ++i)
System.out.println("Student:" + studentList.get(i).toString());
System.out.println("empList");
for(int i = 0; i < employeeList.size(); ++i)
System.out.println("Employee:" + employeeList.get(i).toString());
}
}
}
}
6.sdust-Java-学生成绩读取与排序 (20 分)
1)从键盘录入多行学生成绩的信息,每行表示一个学生的一门课的成绩,最后一行以“exit”结束。每行文本的格式为:学号,姓名,课程名,成绩。程序能够读取学生及其成绩,将具有相同学号的学生及其成绩读取到一个Student(学生类)类对象的列表(List)stuList中; 2)程序在读取完学生及其成绩的数据后,能够将stuList中的学生按照平均成绩降序排列(如果平均成绩相同,学号数字小的排在前面), 并输出排序后的学生学号、姓名和成绩。
输入格式:
多行表示的学生成绩,每一行是一个学生的姓名、学号、课程名、成绩(整数)。不同行可以是同一名学生(学号相同的为同一名学生)不同课程的成绩。
输出格式:
按照学生平均成绩降序排序(平均成绩相同的学号小的在前面)的学生排名(具体输出格式参照样例)。
输入样例:
小明,2001,Java,88
小刚,2002,Java,78
小丁,2003,Java,56
小宏,2004,Java,85
小明,2001,Python,84
小刚,2002,Python,98
小丁,2003,JavaWeb,66
小宏,2004,Algorithm,87
exit
输出样例:
No1:2002,小刚
No2:2001,小明
No3:2004,小宏
No4:2003,小丁
import java.util.*;
class Student implements Comparable<Student>{
//中间注释掉的部分是当初在调试时所加入的调试点,以及调试用的方法
private String name,id;
private int subject=1;
private int score;
private double sum=0;
Student(){}
Student(String name,String id,int score){
this.name=name;
this.id=id;
this.score=score;
}
public String getid(){
return this.id;
}
public void subjectadd() {
this.subject++;
}
public void scoreadd(int score){
this.score=this.score+score;
}
public String getname() {
return this.name;
}
public void sum() {
this.sum=this.score/this.subject;
}
/*public int rescore() {
return this.score;
}*/
/* public double getsum(){
return this.sum;
}*/
public int compareTo(Student o1){
Student one = (Student) o1;
if(this.sum-one.sum!=0)
return (int)(one.sum-this.sum);
else
return this.id.compareTo(one.id);
}
}
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
List<Student> list =new ArrayList<Student>();
int i,flag=0;
String k;
String[] and =new String[5];
while(sc.hasNext())
{
k=sc.next();
and=k.split(",");
if(k.compareTo("exit")==0)
break;
for(i=0;i<list.size();i++)
{
if(list.get(i).getid().compareTo(and[1])==0)
{
flag=1;
break;
}
}
if(flag==1)
{
list.get(i).subjectadd();
list.get(i).scoreadd(Integer.parseInt(and[3]));
}
else
{
list.add(new Student(and[0],and[1],Integer.parseInt(and[3])));
}
flag=0;
}
for(i=0;i<list.size();i++)
list.get(i).sum();
Collections.sort(list);
for(i=0;i<list.size();i++)
{
System.out.println("No"+(i+1)+":"+list.get(i).getid()+","+list.get(i).getname());
//System.out.println(list.get(i).rescore());
}
}
}