
✅ 功能一览
- 从文件
riders.txt 读取数据(格式:姓名,里程)
- 按里程降序排序,生成彩色排行榜
- 给第一名加🌈彩虹条,其余加进度条
- 支持异常处理 & 空文件提示
📄 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 ███████