Java中按出生日期年份排序Personne数组失败问题求助
问题分析与解决方案
嘿,我明白你遇到的麻烦了——你想按Personne数组中出生日期的年份排序,但当前代码完全没达到预期效果。咱们来拆解问题,然后一步步修复它。
问题根源
你的代码里有两个关键错误:
- 字符串不能用
<运算符比较:Java中String是引用类型,不能直接用<或>来比较大小,这甚至会导致编译错误。就算用字符串的compareTo()方法也不适用—— - 按整个日期字符串的字典序比较,不符合年份排序逻辑:比如
"30/12/1989"和"01/01/1990",按字符串字典序前者更大,但年份1989明明比1990小,这时候就会排错顺序。
核心问题是:你需要提取出生日期中的年份数值,然后基于整数大小来排序,而不是比较整个字符串。
解决方案一:修改你的选择排序逻辑
我们可以给Personne类添加一个方法专门提取出生年份,再修改排序时的比较逻辑。
步骤1:给Personne类添加年份提取方法
class Personne { private String nom; private String naissance; //格式为"jj/mm/aaaa"(日/月/年) private int nbCafe; //每日饮用咖啡的杯数 // 原有的构造方法、getter/setter、toString保持不变 // 新增方法:提取出生年份 public int getAnneeNaissance() { // 按"/"分割字符串,取最后一段(年份部分)转成整数 String[] dateParts = this.naissance.split("/"); return Integer.parseInt(dateParts[2]); } }
步骤2:修改trierTableau方法中的比较逻辑
把原来的字符串比较,改成比较年份的整数值:
public static void trierTableau(Personne[] tab) { for (int i = 0; i < tab.length-1; i++) { int indMin = i; for(int j = i+1; j < tab.length; j++) { // 替换成年份整数的比较 if (tab[j].getAnneeNaissance() < tab[indMin].getAnneeNaissance()) { indMin = j; } } if (indMin != i) { Personne tempo = tab[i]; tab[i] = tab[indMin]; tab[indMin] = tempo; } } // 原有的打印代码保持不变 }
解决方案二:使用Java自带的排序工具(更简洁)
其实不用自己写选择排序,Java的Arrays.sort()配合Comparator可以更优雅地实现需求,代码更简洁也不容易出错:
修改main方法中的排序逻辑
import java.util.Arrays; import java.util.Comparator; public class Tp2NumeroA { public static void main(String[] args) { Personne[] tabPeople = new Personne[5]; tabPeople[0] = new Personne("Jo", "16/11/1992", 2); tabPeople[1] = new Personne("Paul", "02/05/1990"); tabPeople[2] = new Personne("Lucie", "23/05/1990", 5); tabPeople[3] = new Personne("Bob", "19/02/1985", 0); tabPeople[4] = new Personne("Carole", "30/06/1991", 2); // 使用Arrays.sort+Comparator按年份排序 Arrays.sort(tabPeople, Comparator.comparingInt(p -> { String[] dateParts = p.getNaissance().split("/"); return Integer.parseInt(dateParts[2]); })); // 打印结果 System.out.println(" Indice Tableau pers"); System.out.println("------------------------------------------------"); for (int i=0; i<tabPeople.length; i++) { System.out.printf(" %d) %s\n", i, tabPeople[i]); } } }
额外建议
如果以后需要更复杂的日期排序(比如先按年份,再按月份,再按日期),建议把naissance字段换成LocalDate类型(Java 8+的日期API),这样可以直接使用日期的比较方法,避免字符串解析的麻烦,也更健壮。比如:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; class Personne { private String nom; private LocalDate naissance; private int nbCafe; public Personne(String nom, String naissanceStr, int nbCafe) { this.nom = nom; // 解析字符串为LocalDate this.naissance = LocalDate.parse(naissanceStr, DateTimeFormatter.ofPattern("dd/MM/yyyy")); this.nbCafe = nbCafe; } // 其他构造方法、getter public LocalDate getNaissance() { return naissance; } }
然后排序时直接比较LocalDate:
Arrays.sort(tabPeople, Comparator.comparing(Personne::getNaissance));
这样代码更易读,也能处理各种日期相关的需求。
内容的提问来源于stack exchange,提问作者Whynotzer
相关产品推荐
相关产品推荐

