1. 程式人生 > >1086: 【基礎】精挑細選的鋼管

1086: 【基礎】精挑細選的鋼管

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));
	}
}

最後附上結果:在這裡插入圖片描述