如何实现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
相关产品推荐
相关产品推荐

