You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中按出生日期年份排序Personne数组失败问题求助

问题分析与解决方案

嘿,我明白你遇到的麻烦了——你想按Personne数组中出生日期的年份排序,但当前代码完全没达到预期效果。咱们来拆解问题,然后一步步修复它。

问题根源

你的代码里有两个关键错误:

  1. 字符串不能用<运算符比较:Java中String是引用类型,不能直接用<或>来比较大小,这甚至会导致编译错误。就算用字符串的compareTo()方法也不适用——
  2. 按整个日期字符串的字典序比较,不符合年份排序逻辑:比如"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:52:40