Description:
小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下:
1、 这根钢管一定要是仓库中最长的;
2、 这根钢管一定要是最长的钢管中最细的;
3、 这根钢管一定要是符合前两条的钢管中编码最大的(每根钢管都有一个互不相同的编码,越大表示生产日期越近)。
今天刷算法题时,看到这道题,心血来潮想要创建一个钢管类来做,java是面对对象的语言,总不能每次都用C语言一样的思路,接下来就是各种百度,查看别人的代码,终于写出了人生最长的一段代码。
先写类,同时为了后面可以排序,继承了Serializable和Comparable接口,还学会了@Override的使用。
import java.util.*;
import java.io.Serializable;
class pipe implements Serializable, Comparable<pipe>{
private long num;
private Integer length;
private int coarse;
public pipe(int length,int coarse,int num) {
this.num=num;
this.length =length;
this.coarse=coarse;
}//构造方法
public long getnum() {
return num;
}
public int getlength() {
return length;
}
public int getcoarse() {
return coarse;
}
@Override
/*@Override是伪代码,表示重写(当然不写也可以),不过写上可以让编译器检查验证
@Override下面的方法名是否是你父类中所有的,如果没有则报错。
没有写上@Override,如果写错方法名,编译器会以为是子类自己增加个新的方法*/
public int compareTo(pipe o) {
return this.length.compareTo(o.getlength());
}
@Override
public String toString() {
return Long.toString(num);
}//用于输出
}
然后这时候发现我重写的compareTo();方法只能根据长度排序,而题意是要求根据三个条件排序,于是又写了个继承于Comparator类的EmpComparator子类用来排序。
class EmpComparator implements Comparator<pipe> {
@Override
public int compare(pipe p1,pipe p2) {
int b = 0;
//按长度升序排列
int a = p1.getlength() - p2.getlength();
if (a != 0) {
b= (a < 0) ? 2: -1;
} else {
//按薪水降序排列
a = p1.getcoarse() - p2.getcoarse();
if (a != 0) {
b= (a > 0) ? 1 : -2;
}else {
//按编号升序排列
a = (int) (p1.getnum() - p2.getnum());
if (a != 0) {
b = (a < 0) ? 1 : -2;
}
}
}
return b;
}
}
最后验证一下:
public class Main{
//private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
pipe[] a = new pipe[scan.nextInt()];
List<pipe> list = new ArrayList<pipe>();
for(int i=0;i<a.length;i++) {
a[i] =new pipe(scan.nextInt(),scan.nextInt(),scan.nextInt());
list.add(a[i]);//把对象添加进容器
}
Collections.sort(list,new EmpComparator());//排序
System.out.print(list.get(0));
}
}
最后附上结果: