Java陣列排序中Comparator介面實現自定義排序
阿新 • • 發佈:2019-02-20
1、為節點排序。節點由3個欄位組成,包括num ,weight ,height 。先按照weight升序排序,再按照height降序排序。
2、使用Comparator介面規則:編寫多個排序方式類實現Comparator介面,並重寫新Comparator介面中的compare()方法。升序是前者減去後者,降序是後者減去前者。
3、程式碼測試:同時也是牛客網中某題。
題目描述:
搜狐員工小王最近利用假期在外地旅遊,在某個小鎮碰到一個馬戲團表演,精彩的表演結束後發現團長正和大夥在帳篷前激烈討論,小王打聽了下了解到, 馬戲團正打算出一個新節目“最高羅漢塔”,即馬戲團員疊羅漢表演。考慮到安全因素,要求疊羅漢過程中,站在某個人肩上的人應該既比自己矮又比自己瘦,或相等。 團長想要本次節目中的羅漢塔疊的最高,由於人數眾多,正在頭疼如何安排人員的問題。小王覺得這個問題很簡單,於是統計了參與最高羅漢塔表演的所有團員的身高體重,並且很快找到疊最高羅漢塔的人員序列。 現在你手上也拿到了這樣一份身高體重表,請找出可以疊出的最高羅漢塔的高度,這份表中馬戲團員依次編號為1到N。輸入描述:
首先一個正整數N,表示人員個數。 之後N行,每行三個數,分別對應馬戲團員編號,體重和身高。
輸出描述:
正整數m,表示羅漢塔的高度。示例1
輸入
6 1 65 100 2 75 80 3 80 100 4 60 95 5 82 101 6 81 70
輸出
4
ac程式碼:dp部分參考了其他人思想,因為自己對dp一直不太熟悉,這次ide寫了一遍,手寫了好幾遍去實現整個過程,總算是明白了。心累....
package schooloffer; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; /** * Created by caoxiaohong on 17/9/22. * 搜狐員工小王最近利用假期在外地旅遊,在某個小鎮碰到一個馬戲團表演,精彩的表演結束後發現團長正和大夥在帳篷前激烈討論,.... * 動態規劃,用到了最長上升子序列問題。首先按照體重從小到大排序,體重相同時,身高高的在上,然後求最長身高上升子序列的長度。 * 要求:疊羅漢過程中,站在某個人肩上的人應該既比自己矮又比自己瘦,或相等。 */ public class CircusTroup { static class People{ int num; int weight; int height; public People(int num,int weight,int height){ this.num=num; this.weight=weight; this.height=height; } } public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int N; while (scanner.hasNext()){ N=scanner.nextInt(); String inValid=scanner.nextLine();//無效 People[] peoples=new People[N]; for(int i=0;i<N;i++){ String[] str=scanner.nextLine().split(" "); peoples[i]=new People(Integer.valueOf(str[0]),Integer.valueOf(str[1]),Integer.valueOf(str[2])); } //第一處:注意地方 //先按照體重升序,再按照身高降序 //為什麼身高要降序?因為:體重相同時,只有身高也相同才可以站在自己肩上,比自己矮是不能站在自己肩上的。 //而身高降序就保證了:體重相同時,身高不同為降序,不是升序序列,則不能站在自己肩上. Arrays.sort(peoples, new Comparator<People>() { @Override public int compare(People o1, People o2) { if(o1.weight==o2.weight){ return o2.height-o1.height; }else{ return o1.weight-o2.weight; } } }); //第二處:注意地方 db部分開始 //按身高求最大升序子序列,不是太會 int[] dp=new int[N]; dp[0]=1; int level=0; for(int i=1;i<N;i++){ dp[i]=1; for(int j=0;j<i;j++){//通過這裡的程式碼,可以知道:子序列並不需要連續,只要滿足if條件就可以 if(peoples[j].height<=peoples[i].height && dp[j]+1>dp[i]) dp[i]=dp[j]+1; } } Arrays.sort(dp); level=dp[N-1]; System.out.println(level); } } }