题目要求如下:首先声明这道题我做出的代码并没有通过PTA检测,但实现了测试用例,从里面我也学习到了一些概念,一些新东西,所以我写出来分享一下
接下来开始我的做题分享和代码分享:
跟着题目要求写出三个类PersonSortable2、NameComparator、AgeComparator,这里需要注意的是 权限为private所以需要get、set方法进行赋值返回。
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;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public String toString(){
return name+"-"+age;
}
}
对于NameComparator、AgeComparator这两个类需要注意的就是排序方法,先写NameComparator类,这个类是字符串排序,不是对字符串内部排序,比如一个人名字叫dcba,内部排序就是把他的名字排序变成abcd,我们是对一个一个名字整体进行排序,如zhangsan,lisi,wangwu,升序排序后就是lisi,wangwu,zhangsan。
我们这种所谓的外部排序就是对一个名字的首字母进行ASCII的大小排序,理解这个概念后我们要进行这种外部排序就需要利用到一个转换方法,我们输入的名字是字符串可以用转换方法将名字的一个个字母单独放入一个数组,取出首字母进行比较即可,“toCharArray()[0]”就是一个转换方法也可以用“.”进行引用,我的代码也是利用这种方法实现的,“if(a[j].getName().toCharArray()[0]>a[j+1].getName().toCharArray()[0])”。
class NameComparator{
public void sort(PersonSortable2 a[]){
System.out.println("NameComparator:sort");
for(int i=0;i<a.length-1;i++)
for(int j=0;j<a.length-1-i;j++)
{
if(a[j].getName().toCharArray()[0]>a[j+1].getName().toCharArray()[0]){
PersonSortable2 b=a[j+1];
a[j+1]=a[j];
a[j]=b;
}
}
}
}
再写AgeComparator类,这个类是整形就不需要用到什么方法进行一个转换,直接进行一个交换排序即可,上面的NameComparator类我重点强调了转换方法,没有讲到交换排序,这两个类的交换排序是一样的,我就直接在这里写了。
交换排序,在C语言中就进行过,两个循环,第一个循环n个数只需要进行n-1次比较即可,第二个循环就是把n个数按顺序进行比较交换,比较一个就少一个数就是代码中的“-i”操作
class AgeComparator{
public void sort(PersonSortable2 a[]){
System.out.println("AgeComparator:sort");
for(int i=0;i<a.length-1;i++)
for(int j=0;j<a.length-1-i;j++)
{
if(a[j].getAge()>a[j+1].getAge()){
PersonSortable2 b=a[j+1];
a[j+1]=a[j];
a[j]=b;
}
}
}
}
最后进行主类的书写,定义的是啥类中传入接受的就是啥数据,调用某个类的方法可以就创建相应类的一个对象,用对象进行调用方法,传入键盘输入的数据可以直接在new后面的()进行书写,比如“a[i]=new PersonSortable2 (sc.next(),sc.nextInt())”,特别要注意调用方法或者数据后面的小括号不能忽略。以及一些语句单词的拼写要注意细节,这次我又因为这些小问题导致浪费了大量时间。
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner (System.in);
int n=sc.nextInt();
PersonSortable2 a[]=new PersonSortable2 [n];
for(int i=0;i<n;i++)
{
a[i]=new PersonSortable2 (sc.next(),sc.nextInt());
}
NameComparator x=new NameComparator();
AgeComparator y=new AgeComparator ();
x.sort(a);
for(int j=0;j<n;j++){
System.out.println(a[j].toString());
}
y.sort(a);
for(int j=0;j<n;j++){
System.out.println(a[j].toString());
}
}
}
特别注意“import java.util.Scanner”要写在最开头,类似与C语言中的库一样,要先进行读取。到这里这道题我想分享的就结束了,但就像我开头说的这个代码PTA结果没有通过,但代码实现没有问题,这下面就给大家把完整代码和测试用例给大家分享看看
import java.util.Scanner;
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;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public String toString(){
return name+"-"+age;
}
}
class NameComparator{
public void sort(PersonSortable2 a[]){
System.out.println("NameComparator:sort");
for(int i=0;i<a.length-1;i++)
for(int j=0;j<a.length-1-i;j++)
{
if(a[j].getName().toCharArray()[0]>a[j+1].getName().toCharArray()[0]){
PersonSortable2 b=a[j+1];
a[j+1]=a[j];
a[j]=b;
}
}
}
}
class AgeComparator{
public void sort(PersonSortable2 a[]){
System.out.println("AgeComparator:sort");
for(int i=0;i<a.length-1;i++)
for(int j=0;j<a.length-1-i;j++)
{
if(a[j].getAge()>a[j+1].getAge()){
PersonSortable2 b=a[j+1];
a[j+1]=a[j];
a[j]=b;
}
}
}
}
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner (System.in);
int n=sc.nextInt();
PersonSortable2 a[]=new PersonSortable2 [n];
for(int i=0;i<n;i++)
{
a[i]=new PersonSortable2 (sc.next(),sc.nextInt());
}
NameComparator x=new NameComparator();
AgeComparator y=new AgeComparator ();
x.sort(a);
for(int j=0;j<n;j++){
System.out.println(a[j].toString());
}
y.sort(a);
for(int j=0;j<n;j++){
System.out.println(a[j].toString());
}
}
}
这道题没有通过主要就是没有按照题目要求利用到接口,但关于接口现在我还是超级初学状态,基础知识都很欠缺更别说能力了,后面B站大学补补课再回头看看,会不会有更多的理解,再更新一下关于这道题的接口正确运行的代码与理解学习体会。后面会继续记录分享我的java学习之旅,宝子们一起努力!!!