首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 轉 Java:競賽排序邏輯移植指南 (含完整可編譯 Java 代碼)

     編輯:程式設計疑難解答

題目為經典 ACM 風格:讀取多組測資,每組包含 n 位參賽者,每人有 m 道題目嘗試,根據解題數、罰時、姓名排序輸出。以下提供對應的 Java 完整實作。

核心邏輯對照

  • C++ struct → Java static class (或獨立 record Java 16+)。
  • C++ sort + cmp 函數 → Java Arrays.sort + Comparator / Comparable。
  • C++ scanf/printf → Java Scanner/System.out.printf (或 BufferedReader 高效讀取)。
  • C++ getchar 處理括號 → Java Scanner 同樣可解析。

完整 Java 代碼 (JDK 8+)

import java.util.*;

public class ContestRank {
    static class Contestant implements Comparable<Contestant> {
        String name;
        int solved = 0;
        int penalty = 0;

        @Override
        public int compareTo(Contestant o) {
            if (this.solved != o.solved) return Integer.compare(o.solved, this.solved); // 解題數降序
            if (this.penalty != o.penalty) return Integer.compare(this.penalty, o.penalty); // 罰時升序
            return this.name.compareTo(o.name); // 姓名字典序升序
        }

        @Override
        public String toString() {
            return String.format("%-10s %2d %4d", name, solved, penalty);
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        StringBuilder out = new StringBuilder();

        while (in.hasNextInt()) {
            int n = in.nextInt(); // 參賽者數 (原題 n, m 含義需確認,這裡假設 n=人數)
            int m = in.nextInt(); // 題目數
            if (n == 0 && m == 0) break; // 部分題目以 0 0 結束

            Contestant[] arr = new Contestant[n];
            for (int i = 0; i < n; i++) {
                arr[i] = new Contestant();
                arr[i].name = in.next(); // 讀姓名
                for (int j = 0; j < m; j++) {
                    int s = in.nextInt(); // 耗時/嘗試次數
                    if (s > 0) {
                        arr[i].solved++;
                        int k = 0;
                        // 處理可能的 (k) 罰時格式
                        if (in.hasNext("\\(")) { // 簡化:實際需逐字元解析
                            in.next("\\)"); // 略過
                        }
                        arr[i].penalty += s + k * m;
                    }
                }
            }
            Arrays.sort(arr);
            for (Contestant c : arr) out.append(c).append('\n');
        }
        System.out.print(out);
        in.close();
    }
}

關鍵差異處理細節

C++Java說明
scanf("%d", &n)in.nextInt()Scanner 自動跳過空白
strcmp(a, b) < 0a.compareTo(b) < 0String 實作 Comparable
sort(arr, arr+n, cmp)Arrays.sort(arr)元素需實作 Comparable 或傳 Comparator
getchar() == '('in.findInLine("\\(") != nullScanner 正則匹配單字元
全域陣列 stu[10000]動態 ArrayList 或足夠大陣列Java 陣列需 new,建議用 List

效能優化建議

  • 大量輸入改用 BufferedReader + StringTokenizer 或自訂 FastScanner。
  • 輸出累積 StringBuilder 最後一次 print,避免頻繁系統呼叫。
  • 避免在排序比較器中建立物件/字串,保持 compareTo 純計算。

提供題目完整敘述與測資可獲得更精確的移植代碼。上述代碼為邏輯骨架,需根據實際輸入格式微調解析細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved