使用Comparable在java中对Custom类进行排序

时间:2014-12-09 13:04:08

标签: java sorting comparable

我有这个自定义课程,我想按饱和度和亮度对其进行排序 我尝试过自定义编写器类,但它不起作用 现在我已尝试实施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;
        }
    }
}

2 个答案:

答案 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());
}