终端版“骑行里程排行榜

28 阅读1分钟

微信图片_20251014151033_10_20.jpg

✅ 功能一览

  1. 从文件 riders.txt 读取数据(格式:姓名,里程
  2. 按里程降序排序,生成彩色排行榜
  3. 给第一名加🌈彩虹条,其余加进度条
  4. 支持异常处理 & 空文件提示

📄 riders.txt(示例)

Alice,120.5
Bob,88.0
Charlie,105.2
David,134.8

🌈 Java源码:ColorRank.java

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.stream.*;

public class ColorRank {
    private static final String RESET = "\u001B[0m";
    private static final String GREEN = "\u001B[32m";
    private static final String YELLOW = "\u001B[33m";
    private static final String CYAN = "\u001B[36m";

    public static void main(String[] args) {
        String fileName = "riders.txt";
        try {
            List<Rider> riders = loadRiders(fileName);
            if (riders.isEmpty()) {
                System.out.println("❌ 文件为空,暂无骑行数据!");
                return;
            }
            // 降序排序
            riders.sort((r1, r2) -> Double.compare(r2.distance, r1.distance));
            double max = riders.get(0).distance;

            System.out.println(YELLOW + "🏆 骑行里程排行榜 🏆" + RESET);
            for (int i = 0; i < riders.size(); i++) {
                Rider r = riders.get(i);
                double percent = r.distance / max;
                String bar = progressBar(percent, i == 0);
                System.out.printf("%s第%2d名:%-8s %6.1f km %s%s%n",
                        i == 0 ? CYAN : GREEN, i + 1, r.name, r.distance, bar, RESET);
            }
        } catch (IOException e) {
            System.err.println("读取文件失败:" + e.getMessage());
        }
    }

    /* 读取并解析文件 */
    private static List<Rider> loadRiders(String file) throws IOException {
        return Files.lines(Paths.get(file))
                    .filter(line -> !line.trim().isEmpty())
                    .map(line -> {
                        String[] p = line.split(",");
                        if (p.length != 2) return null;
                        try {
                            return new Rider(p[0].trim(), Double.parseDouble(p[1].trim()));
                        } catch (NumberFormatException e) {
                            return null;
                        }
                    })
                    .filter(Objects::nonNull)
                    .collect(Collectors.toList());
    }

    /* 进度条 / 彩虹条 */
    private static String progressBar(double ratio, boolean rainbow) {
        int len = (int) (ratio * 25);
        if (rainbow) return rainbowBar(len);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) sb.append("▊");
        return sb.toString();
    }

    private static String rainbowBar(int len) {
        String[] colors = {"\u001B[31m", "\u001B[33m", "\u001B[32m", "\u001B[36m", "\u001B[34m"};
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) sb.append(colors[i % colors.length]).append("▊");
        return sb.toString();
    }

    /* 内部实体类 */
    private static class Rider {
        final String name;
        final double distance;

        Rider(String name, double distance) {
            this.name = name;
            this.distance = distance;
        }
    }
}

✅ 运行效果(终端彩色)

🏆 骑行里程排行榜 🏆
第 1名:David   134.8 km 彩虹条🌈
第 2名:Alice   120.5 km ████████████
第 3名:Charlie 105.2 km █████████
第 4名:Bob      88.0 km ███████