编程诡事2020年6月7日

今天看到一个练习题,感觉难度适中,就试着做了一下,但是发现不太会做,先来看看题目:在这里插入图片描述
考察知识点非常简单,是对于comparable接口的实现,然后昨天也看了不少博客,实现方法大致如下:

  1. 一开始肯定是需要导入包:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;//因为我用List接受的ArrayList对象,所以导入了List包
    
  2. 实现compareTo()方法,定义优先顺序,返回值是一个int类型,猜测是通过正负号表示当前对象是否大于参数对象。传入的参数是一个与当前对象相同的类对象,如果是 "this - arg0"则得到的排序方式是升序,反之则是降序。

  3. 在主方法中调用Collections.sort(),参数是要排序的ArrayList对象。Collection是集合类的父类接口,sort()是该类中的静态方法,会根据compareTo()的排序法则进行排序。

  4. 调用排序方法时候不知为何Java抛出了数组下标越界异常,我单纯进行抓捕之后便没事了并且顺利运行出结果,但是结果并不正确。

因为逻辑非常简单所以就没有打注释,具体代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Employee extends Person {
	private int salary;
	private String crop;
	public Employee(String id, String name, String sex, int salary, String crop) {
		super(id, name, sex);
		this.salary = salary;
		this.crop = crop;
	}
	@Override
	public String toString() {
		return "Employee [id=" + this.getId() + ", name=" + this.getName() + ", sex=" + this.getSex() + ", salary=" + this.getSalary() + ", crop=" + getCrop() + "]";
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	public String getCrop() {
		return crop;
	}
	public void setCrop(String crop) {
		this.crop = crop;
	}
	public static void main(String[] args){
		List  personList = new ArrayList();
		personList.add(new Person("00000001","张三","男"));
		personList.add(new Employee("0000000X","广场舞大妈","女",0,"东大街路口第五号"));
		personList.add(new Person("000000000","李四","男"));
		personList.add(new Person("00000002","王五","男"));
		personList.add(new Employee("0000000A","跑堂的李狗蛋","男",100,"同福客栈"));
		personList.add(new Person("000000009","赵六","男"));
		personList.add(new Person("00000013","张大麻子","男"));
		personList.add(new Employee("00000008","迪丽热巴","女",10000,"未知"));
		personList.add(new Employee("00000006","马尔扎哈","女",10000,"未知"));
		personList.add(new Employee("0000000Y","沙扬娜拉","女",10000,"未知"));
		personList.add(new Person("000000017","采花贼","男"));
		for (Object p : personList)
		{
			System.out.println(p.toString());
		}
		try {
			Collections.sort(personList);
		}catch (Exception E){
			
		}
        System.out.println("After sort");
        for (Object p : personList)
		{
			System.out.println(p.toString());
		}
	}
}

class Person implements Comparable<Person>{
	private String id;
	private String name;
	private String sex;
	public Person(String id, String name, String sex) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", sex=" + sex + "]";
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	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;
	}
	@Override
	public int compareTo(Person arg0) {
		// TODO Auto-generated method stub
		char[] charArrayOne = this.id.toCharArray();
		char[] charArrayTwo = arg0.id.toCharArray();
		if (0 <= charArrayOne.length){
			for (int i = 0;i < charArrayOne.length;i++)
			{
				//System.out.println(i);
				if (charArrayOne[i] == charArrayTwo[i]){
					continue;
				}
				else{
					return charArrayOne[i] - charArrayTwo[i];
				}
			}
		}
		return 0;
	}
}

运行结果如下:在这里插入图片描述上面这个其实是正确的运行结果,因为李四和赵六的ID有8个0。
这些是我在编程学习的路上遇到的一些无法理解的知识的所获和所惑,并不严谨,如果您愿意指正我的错误,不胜感激。我的QQ号是:2858885213。

关于这个的另外一种实现方式是注释comparable的实现,在主方法前加上:

@SuppressWarnings("unchecked")

将compareTo函数替换成下面这一段:

Collections.sort(personList,new Comparator<Person>() {
				public int compare(Person o1, Person o2) {
					char[] charArrayOne = o1.getId().toCharArray();
					char[] charArrayTwo = o2.getId().toCharArray();
					for (int i = 0;i < charArrayOne.length;i++)
					{
						if (charArrayOne[i] == charArrayTwo[i]){
							continue;
						}
						else{
							return charArrayOne[i] - charArrayTwo[i];
						}
					}
					return 0;
				}
			});

这个是以传入比较器的方式传入,与Comparable相比,比较器相当于找一个第三者裁判来帮助比较,Comparable则是将自己跟别人比较。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值