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

如何实现Comparator对Element类先按group再按number排序?

没问题,我来帮你实现这个符合需求的Comparator!

首先,按照你给出的框架,我们可以编写一个单独的GroupComparator类,实现Comparator<Element>接口,在compare方法里先按group排序,group相同时再按number排序:

import java.util.Comparator;

class GroupComparator implements Comparator<Element> {
    @Override
    public int compare(Element e1, Element e2) {
        // 先比较group属性,用Integer.compare避免整数溢出问题
        int groupCompareResult = Integer.compare(e1.group, e2.group);
        
        // 如果group不同,直接返回比较结果
        if (groupCompareResult != 0) {
            return groupCompareResult;
        }
        
        // 当group相同时,比较number属性
        return Integer.compare(e1.number, e2.number);
    }
}

一些细节说明:

  • 我用Integer.compare()而不是直接做减法(比如e1.group - e2.group),这是更规范的写法——虽然你的group和number都是正整数,溢出概率很低,但用Integer.compare()能完全避免整数溢出的风险,同时代码可读性也更好。
  • 如果你的Element类属性是private(建议把成员变量设为私有,通过getter访问),那需要先给Element添加对应的getter方法:
    public class Element {
        // 成员变量改为private
        private int number, group, period;
        private String symbol, name;
        private double weight;
        
        // 构造方法不变
        public Element(int number, String symbol, String name, int group, int period, double weight) {
            this.number = number;
            this.symbol = symbol;
            this.name = name;
            this.group = group;
            this.period = period;
            this.weight = weight;
        }
        
        // 添加getter方法
        public int getGroup() { return group; }
        public int getNumber() { return number; }
        // 其他属性的getter按需添加
    }
    

Java 8+ 简化写法

如果你用的是Java 8或更高版本,完全可以不用写单独的Comparator类,用lambda表达式或者Comparator的链式API来简化代码,更加简洁:

方式1:Lambda表达式

Comparator<Element> groupComparator = (e1, e2) -> {
    int groupComp = Integer.compare(e1.group, e2.group);
    return groupComp != 0 ? groupComp : Integer.compare(e1.number, e2.number);
};

方式2:链式Comparator API(更优雅)

Comparator<Element> groupComparator = Comparator.comparingInt(Element::getGroup)
                                               .thenComparingInt(Element::getNumber);

使用示例

不管用哪种写法,排序List的方式都很简单:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Element> elements = new ArrayList<>();
        // 添加测试元素
        elements.add(new Element(1, "H", "Hydrogen", 1, 1, 1.008));
        elements.add(new Element(2, "He", "Helium", 18, 1, 4.003));
        elements.add(new Element(3, "Li", "Lithium", 1, 2, 6.941));
        
        // 使用自定义Comparator排序
        Collections.sort(elements, new GroupComparator());
        // 或者用Java 8的List.sort方法
        // elements.sort(groupComparator);
        
        // 输出验证
        elements.forEach(e -> System.out.println(e.name + " - Group: " + e.group + ", Number: " + e.number));
    }
}

运行后你会看到,同组的元素会按原子序数(number)排序,不同组的按组号排序。

内容的提问来源于stack exchange,提问作者George Ponta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:45:54