Сортировка Hex Color по убыванию темноты в Java - PullRequest
1 голос
/ 20 апреля 2020

Я ищу способ сортировки списка шестнадцатеричных цветов от темного к светлому / от светлого к темному, т.е. все оттенки красного цвета должны быть отсортированы как темно-красный, от светло-красного до розового. Там также могут быть оттенки других цветов. Сначала я хочу показать отсортированные оттенки красного, затем отсортированные оттенки других цветов в любом порядке, т.е. отсортированный красный, отсортированный синий, отсортированный зеленый и т. Д. c.

Сначала я преобразовал RGB в HSB / HSL, а затем отсортировал его. ссылаясь на сообщения ( Sort Hex Color Values ​​, Сортировка списка цветов по HSV / HSB )

Я реализовал тестовую версию basi c в Java используя код ниже

  public class classA {
  public static Color hex2Rgb(String colorStr) {
    return new Color(
          Integer.valueOf( colorStr.substring( 1, 3 ), 16 ),
          Integer.valueOf( colorStr.substring( 3, 5 ), 16 ),
          Integer.valueOf( colorStr.substring( 5, 7 ), 16 ) );
     }
  public static void main(String[] args) {
  String hex = "#FFFFFF";
  ArrayList<String> colors = new ArrayList<>();
  colors.add("#FFA07A");
  colors.add("#FA8072");
  colors.add("#E9967A");
  colors.add("#F08080");
  colors.add("#CD5C5C");
  colors.add("#DC143C");
  colors.add("#B22222");
  colors.add("#FF0000");
  colors.add("#8B0000");
  colors.add("#800000");
  colors.add("#FF6347");
  colors.add("#FF4500");
  colors.add("#DB7093");

  ArrayList<Color> colorArrayList = new ArrayList<>();
  for (String s : colors) {
     Color colorcode = hex2Rgb(s);
     colorArrayList.add(colorcode);
  }
  Collections.sort(colorArrayList, new 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;
     }
  });
  ArrayList<String> res = new ArrayList<>();
  for(Color c: colorArrayList){
     String hexc = String.format("#%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue());
     res.add(hexc);
  }
  for(String s: res){
     System.out.println(s);
  }

}

Это не работает для моего варианта использования. Буду признателен за любую помощь.

PS: лучше было бы без использования библиотек AWT.

...