我有这个自定义课程,我想按饱和度和亮度对其进行排序
我尝试过自定义编写器类,但它不起作用
现在我已尝试实施Comparable
。该程序贯穿代码,但最后没有对列表进行排序。
这是我的代码。
部分测试类:
ArrayList<HSBColor> colorList = new ArrayList<HSBColor>(colors.values());
Collections.sort(colorList);
for(HSBColor co : colorList){
System.out.println(co.toString());
}
自定义类HSBColor
public class HSBColor implements Comparable<HSBColor>{
private float H;
private float S;
private float B;
public HSBColor(float h, float s, float b) {
H = h;
S = s;
B = b;
}
public float getH() {
return H;
}
@Override
public String toString() {
return String.format("%.2f %.2f %.2f", H,S,B);
}
public void setH(float h) {
H = h;
}
public float getS() {
return S;
}
public void setS(float s) {
S = s;
}
public float getB() {
return B;
}
public void setB(float b) {
B = b;
}
@Override
public int compareTo(HSBColor o) {
if(this.getS() > o.getS() && this.getB() > o.getB()){
return 1;
}
else{
return -1;
}
}
}
提前谢谢!
编辑:额外代码
这是排序前的颜色:
Color HSB H:28.60465 S:71.07438 B:47.45098
Color HSB H:4.4999995 S:73.059364 B:85.882355 >> This is the one i need
Color HSB H:64.18605 S:79.62963 B:21.176472
Color HSB H:65.714294 S:39.873417 B:61.960785
Color HSB H:23.333332 S:40.0 B:70.588234
这是排序后的颜色
28,60 71,07 47,45
65,71 39,87 61,96
23,33 40,00 70,59
4,50 73,06 85,88
64,19 79,63 21,18
**编辑新算法**
这个比较正确,但没有对它们进行排序..
@Override
public int compareTo(HSBColor o) {
if(this.getS() > o.getS()) {
if(this.getB() >o.getB()){
return 1;
}
else{
return 0;
}
}
else{
if(this.getB() < o.getB()){
return -1;
}
else{
return 0;
}
}
}
答案 0 :(得分:1)
您的compareTo
方法没有定义正确的顺序。
假设this.getS()&gt; o.getS()但是this.getB()&lt; o.getB()。
this.compareTo(o)将返回-1,但是o.compareTo(this)也会返回-1。
如果A&lt; B和B&lt;这不是一个正确的顺序。
正确的排序首先要通过更重要的属性进行比较,然后,在相等的情况下,通过不太重要的属性进行比较。
例如:
@Override
public int compareTo(HSBColor o) {
if(this.getS() > o.getS()){
return 1;
} else if (this.getS() < o.getS()) {
return -1;
} else {
if (this.getB() > o.getB()) {
return 1;
} else if (this.getB() < o.getB()) {
return -1;
} else {
return 0;
}
}
}
答案 1 :(得分:0)
compareTo方法存在问题。您应该像以下一样使用它:
@Override
public int compareTo(HSBColor o) {//if saturation is equal then compare brightness.
if (this.S == o.getS()) {
return Float.compare(B, o.getB());
}
return Float.compare(S, o.getS());
}