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,提问作者Максим
相关产品推荐
相关产品推荐

