【问题标题】:Sort an (Array)List with a specific order以特定顺序对(数组)列表进行排序
【发布时间】:2014-01-01 05:55:05
【问题描述】:

我有一个对象列表,我想按照定义的顺序对其进行排序。 例如。我有一个带有String color 字段的对象。我想在颜色字段上对我的列表进行排序,以便它总是先是白色,然后是蓝色,然后是黄色,然后是所有其他(如果可能的话,按顺序排列,但不是必需的):

Before sorting:         After sorting:
orange                  white
white                   blue
green                   yellow
brown                   orange
yellow                  black
black                   brown
...                     ...

有没有(简单的)方法可以做到这一点?

编辑:

我必须添加更多复杂功能...
如果可以有更多具有相同名称/基数的颜色怎么办?例如。 whiteX, whiteY, whiteZ, blueA, blueB, ...
所有的白人必须先于所有的蓝色,然后是所有的黄色,然后是所有其他人。仍然可以用比较器解决这个问题吗? (我无法想象如何......)

【问题讨论】:

    标签: java list sorting arraylist


    【解决方案1】:

    这是另一个选择:

    Map<Integer, String> tree = new TreeMap<Integer, String>();
        List<String> listOrdre = Arrays.asList("white", "blue", "yellow", "orange", "black", "brown");
        List<String>   myList  = Arrays.asList("orange", "white", "brown", "yellow", "black");
    
        for (String code : myList) {
            tree.put(listOrdre.indexOf(code), code);
        }
    
        System.out.println(tree.values()); // -> [white, yellow, orange, black, brown]
    

    【讨论】:

      【解决方案2】:

      是的,您可以创建一个Comparator 来创建您的排序策略,或者定义实现Comparable 的类的自然顺序

      附注:

      强烈建议,但不严格要求 (x.compareTo(y)==0) == (x.equals(y))

      使用比较器的示例:

      class MyClass {
      
      private Color color;
      private String someOtherProperty;
      public static final Comparator<MyClass> COLOR_COMPARATOR = new MyComparator();
      
      //getter and setter
      
      static class MyComparator implements Comparator<MyClass>{
      
                  @Override
                  public int compare(MyClass o1, MyClass o2) {
                      // here you do your business logic, when you say where a color is greater than other
                  }    
      }
      
      }
      

      在客户端代码中。

      例子:

      List<MyClass> list = new ArrayList<>();
      //fill array with values
      Collections.sort(list, MyClass.COLOR_COMPARATOR );
      

      阅读更多:Collections#sort(..)

      如果您想定义类的自然排序,只需定义

      public class MyClass implements Comparable<MyClass>{
      
              @Override
              public int compareTo(MyClass o) {
                 // do business logic here
              }
      }
      

      在客户端代码中:

         Collections.sort(myList); // where myList is List<MyClass>
      

      【讨论】:

      【解决方案3】:

      您可以使用comparator

      您可以做的另一件事是为数字设置一些值(比如 1 到 n )。例如,在您的情况下,给白色 1,给蓝色 2,给黄色 3。现在对这些数字进行排序。

      【讨论】:

        【解决方案4】:

        另一种解决方案是在比较器中使用枚举,因为枚举已经定义了一个索引(序数)。

        首先,按照您希望排序的顺序使用您的值创建一个枚举。

        enum class MyColour {
            WHITE,
            BLUE,
            YELLOW,
            ORANGE,
            BLACK,
            BROWN
        }
        

        对于每个对象,您可以使用Mycolour.valueOf("WHITE") 获取枚举值。注意:这是区分大小写的。

        接下来,您可以简单地使用比较器。

        val sortedList = list.sortedBy { it.colour } // colour being the enum value we defined.
        

        【讨论】:

          猜你喜欢
          • 2017-04-08
          • 1970-01-01
          • 2018-02-11
          • 1970-01-01
          • 2019-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-03
          相关资源
          最近更新 更多