2015-10-11 42 views
0

我正在实现图像的中值切割算法,我有一个ArrayList与所有像素,但现在我需要基于一个颜色通道对它进行排序。这是我的Pixel类。排序对象的ArrayList,但排序键不断变化

public class Pixel implements Comparable<Pixel>{ 
    public int x,y; 
    public double[] colors; 

    public Pixel(int x, int y, double[] colors){ 
     this.x=x; 
     this.y=y; 
     this.colors=colors; 
    } 

    @Override 
    public int compareTo(Pixel compareNode) { 
     //not sure what to do here 
     return 0; 
    } 
} 

的颜色阵列保持在[0],[1]和[2]分别但是当我重写的compareTo()方法不知RGB值我将如何通过特定的排序颜色通道。我只需要实现我自己的排序方法?

+3

你总是希望以同样的方式像素进行排序,或者你希望能够选择排序哪个颜色通道的?如果你想要后者,你可能想创建一些'Comparators',而不是'Comparable'。 – andersschuller

+0

**“我需要根据一个颜色通道对其进行排序”**表示什么?您是否需要按照以下方式对所有像素进行排序:基于RED,然后基于GREEN,然后基于BLUE? – STaefi

+0

我需要根据最宽的颜色通道进行排序。所以说红色值从2-250,绿色从45-180,蓝色从100-200我想要整个列表相对于红色通道排序。 – Alex

回答

2

要按特定通道排序,您可以为每种颜色创建一个比较器。例如由红色值进行排序,你可以用下面的例子

public static class RedComparator implements Comparator<Pixel> { 
    @Override 
    public int compare(Pixel p1, Pixel p2) { 
     return Double.compare(p1.colors[0], p2.colors[0]); 
    } 
} 

然后可以使用 Collections.sort(yourArrayList, new RedComparator())由红色ArrayList中排序。

您可以创建其他两个比较绿色和蓝色

+1

在'colors'是一个'double []'的问题,但我同意它应该是一个'int []'。 –

+1

的确发现了这一点。我将在代码中修复它,但建议将颜色更改为int [] – triadiktyo

+0

我被告知RGB值可以是小数,所以我只使用双数据类型。感谢您的帮助。 – Alex