1、題目描述
某個開源社區希望將最近熱度比較高的開源項目出一個榜單,推薦給社區里面的開發者。
對于每個開源項目,開發者可以進行關注(watch)、收藏(star)、fork、提issue、提交合并請求(MR)等。
數據庫里面統計了每個開源項目關注、收藏、fork、issue、MR的數量,開源項目的熱度根據這5個維度的加權求和進行排序。
H = (Wwatch * #watch) + (Wstar * #star) + (Wfork * #fork) + (Wissue * #issue) + (Wmr * #mr)
H表示熱度值
Wwatch、Wstar、Wfork、Wissue、Wmr分別表示5個統計維度的權重。
#watch、#star、#fork、#issue、#mr分別表示5個統計維度的統計值。
榜單按照熱度值降序排序,對于熱度值相等的,按照項目名字轉換為全小寫字母后的字典序排序(‘a’,‘b’,‘c’,…,‘x’,‘y’,‘z’)。
輸入描述
第一行輸入為N,表示開源項目的個數,0 < N <100。
第二行輸入為權重值列表,一共 5 個整型值,分別對應關注、收藏、fork、issue、MR的權重,權重取值 0 < W ≤ 50。
第三行開始接下來的 N 行為開源項目的統計維度,每一行的格式為:
name nr_watch nr_start nr_fork nr_issue nr_mr
其中 name 為開源項目的名字,由英文字母組成,長度 ≤ 50,其余 5 個整型值分別為該開源項目關注、收藏、fork、issue、MR的數量,數量取值 0 < nr ≤ 1000。
輸出描述
按照熱度降序,輸出開源項目的名字,對于熱度值相等的,按照項目名字轉換為全小寫后的字典序排序(‘a’ > ‘b’ > ‘c’ > … > ‘x’ > ‘y’ > ‘z’)。
2、解法
import java.util.Comparator;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main1 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt(); //讀取項目數int[] weights = new int[5]; //讀取權重for (int i = 0; i < weights.length; i++) {weights[i] = in.nextInt();}Map<String, String> hotMap = new TreeMap<>(new MyComparator());for (int i = 0; i < n; i++) {int tempHot = 0;String tempName = in.next();for (int j = 0; j < weights.length; j++) {tempHot += weights[j] * in.nextInt();}hotMap.put(tempName+"_"+tempHot, tempName);}for (Map.Entry<String, String> prjEntry : hotMap.entrySet()) {System.out.println(prjEntry.getValue());}}public static int compareStr(String str1, String str2) {str1 = str1.toLowerCase();str2 = str2.toLowerCase();int len = str1.length() > str2.length() ? str2.length() : str1.length();int i = 0;for (; i < len; i++) {if (str1.charAt(i) < str2.charAt(i)) {return 1;} else if (str1.charAt(i) == str2.charAt(i)) {continue;} else if (str1.charAt(i) > str2.charAt(i)) {return -1;}}return 0;}public static class MyComparator implements Comparator<String> {@Overridepublic int compare(String k1, String k2) {String k1Name = k1.split("_")[0];int k1Hot = Integer.parseInt(k1.split("_")[1]);String k2Name = k2.split("_")[0];int k2Hot = Integer.parseInt(k2.split("_")[1]);if (k1Hot < k2Hot) {return 1;} else if (k1Hot == k2Hot) {if (compareStr(k1Name, k2Name) > 0) {return 1;} else if (compareStr(k1Name, k2Name) == 0) {return 1;} else if (compareStr(k1Name, k2Name) < 0) {return -1;}} else {return -1;}return 0;}}
}