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

Color对象列表按isPrimary字段排序失败问题及解决咨询

问题描述

我有一个Color对象列表,想要按isPrimary字段排序,尝试实现Comparable接口仿照导师的写法,但导师用的是String类型,我这里isPrimary是boolean类型,导致compareTo方法报错。相关代码如下:

Color对象列表示例

List<Color> colorList = generateColorList(10);

System.out.println(colorList);

System.out.println(colorList.stream().sorted().collect(Collectors.toList())); // 排序代码

// 列表输出示例
// [Color{colors=[#91E7CE, #FCEF32, #859BDF], isPrimary=true, rgb={r=126, b=155, g=112}}, 
// Color{colors=[#E53DE3, #589003, #12AC95], isPrimary=false, rgb={r=111, b=140, g=232}}, 
// ... 其余对象省略 ...]

Color类定义

public class Color implements Serializable, Comparable {
    private List<String> colors;
    @JsonProperty("isPrimary")
    private boolean primary;
    private HashMap<String,Integer> rgb = new HashMap<String,Integer>();
    public Color(){};

    public List<String> getColors() {
        return colors;
    }

    public void setColors(List<String> colors) {
        this.colors = colors;
    }

    public boolean GetIsPrimary() {
        return primary;
    }

    public void setIsPrimary(boolean primary) {
        this.primary = primary;
    }

    public HashMap<String, Integer> getRgb() {
        return rgb;
    }

    public void setRgb(HashMap<String, Integer> rgb) {
        this.rgb = rgb;
    }

    @Override
    public String toString() {
        return "Color{" +
                "colors=" + colors +
                ", isPrimary=" + primary +
                ", rgb=" + rgb +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        Color o1 = (Color)this;
        Color o2 = (Color)o;
        return o1.GetIsPrimary().compareTo(o2.GetIsPrimary()); // 此处报错,boolean无compareTo方法
    }
}
解决方案

方法1:修正compareTo方法并规范代码

boolean类型没有compareTo方法,你可以用Boolean.compare()工具方法来处理,同时建议给Comparable指定泛型避免强制类型转换,还要修正boolean类型getter的命名(遵循Java规范,应该用isXxx()格式):

// 先修正getter方法名
public boolean isPrimary() {
    return primary;
}

// 实现泛型版Comparable
public class Color implements Serializable, Comparable<Color> {
    // ... 其余代码不变 ...

    @Override
    public int compareTo(Color o) {
        // 按isPrimary降序:true在前,false在后
        return Boolean.compare(o.isPrimary(), this.isPrimary());
        // 若要升序(false在前),则用:
        // return Boolean.compare(this.isPrimary(), o.isPrimary());
    }
}

方法2:不修改Color类,直接在Stream中指定排序规则

如果不想改动Color类的实现,可以在调用sorted()时传入自定义Comparator:

// 升序:false在前,true在后
List<Color> sortedAscList = colorList.stream()
    .sorted(Comparator.comparing(Color::GetIsPrimary))
    .collect(Collectors.toList());

// 降序:true在前,false在后
List<Color> sortedDescList = colorList.stream()
    .sorted(Comparator.comparing(Color::GetIsPrimary).reversed())
    .collect(Collectors.toList());

额外说明

  • Boolean.compare(a, b)的返回规则:a和b相等返回0;a为true、b为false返回1;a为false、b为true返回-1
  • 遵循JavaBean规范能减少框架适配问题,boolean类型的getter方法优先用isXxx()而非GetXxx()

内容的提问来源于stack exchange,提问作者Максим

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:50:30