1086: 【基礎】精挑細選的鋼管
阿新 • • 發佈:2018-12-15
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));
}
}
最後附上結果: