【问题标题】:Sort list of colors by HSV/HSB按 HSV/HSB 排序颜色列表
【发布时间】:2012-07-24 00:08:11
【问题描述】:

我希望按 HSV/HSB 值对很长的颜色列表进行排序。我想按色调,然后是星期六,然后是明亮对它们进行排序。实际上,我需要的只是一种方法来根据 HSV 的顺序来判断一种颜色是“之前”还是“之后”,因为我只是要在 Java 中创建一个 compareTo() 并使用 TreeSet 来进行排序。在 Java 中,HSV 值都存储为浮点数。

我不擅长这样的算法,所以任何帮助都将不胜感激!

【问题讨论】:

    标签: sorting colors compare hsv hsb


    【解决方案1】:

    蛮力方式:

    public final class ColorComparator implements Comparator<Color> {
        @Override
        public int compare(Color c1, Color c2) {
            float[] hsb1 = Color.RGBtoHSB(c1.getRed(), c1.getGreen(), c1.getBlue(), null);
            float[] hsb2 = Color.RGBtoHSB(c2.getRed(), c2.getGreen(), c2.getBlue(), null);
            if (hsb1[0] < hsb2[0])
                return -1;
            if (hsb1[0] > hsb2[0])
                return 1;
            if (hsb1[1] < hsb2[1])
                return -1;
            if (hsb1[1] > hsb2[1])
                return 1;
            if (hsb1[2] < hsb2[2])
                return -1;
            if (hsb1[2] > hsb2[2])
                return 1;
            return 0;
        }
    }
    

    如果您可以使用 Google Guava 库,那么一个非常简单、无需考虑的方法是:

    public final class ColorComparator extends Ordering<Color> {
        @Override
        public int compare(Color c1, Color c2) {
            float[] hsb1 = Color.RGBtoHSB(c1.getRed(), c1.getGreen(), c1.getBlue(), null);
            float[] hsb2 = Color.RGBtoHSB(c2.getRed(), c2.getGreen(), c2.getBlue(), null);
            return ComparisonChain.start().compare(hsb1[0], hsb2[0]).compare(hsb1[1], hsb2[1])
                .compare(hsb1[2], hsb2[2]).result();
        }
    }
    

    我会说只是遍历数组并比较它们(或在 Guava 中使用字典顺序),但您可能想要更改排序顺序。

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 2013-03-18
      • 2012-09-03
      • 1970-01-01
      • 2021-07-09
      • 2018-09-26
      • 2010-11-18
      • 2018-10-21
      相关资源
      最近更新 更多