【问题标题】:How to sort a list object by the other list in java如何通过java中的另一个列表对列表对象进行排序
【发布时间】:2020-10-25 20:41:01
【问题描述】:

我有以下对象:

public class Processitems{
   private String priority;
   private Date date;
   private Integer status;
}

public class OrderItems {
   private String orderItem1;
   private String orderItem2;
}

orderItem1, orderItem2 是“优先级”或“日期”或“状态” 现在我必须按照 OrderItems 的条件对List<ProcessItem> 进行排序。我的意思是如果 orderItem1 = "priority" 然后按优先级对 List<ProcessItem> 进行排序,如果 orderItem = "date" 然后按日期对 List 进行排序,...如果按 orderItem1 排序不可用,则按 orderItem2 排序。我怎么能用Comperator.comparing(orderItem1).thencomparing(orderItem2)

【问题讨论】:

  • 你可以使用 Comparator 。检查这个geeksforgeeks.org/comparable-vs-comparator-in-java
  • “如果按 orderItem1 排序不可用,则按 orderItem2 排序”是什么意思?什么情况下“按orderItem1排序”不可用?
  • @Joni 如果 orderItem1 为空,则使用 orderItem2。
  • @Joni :例如:orderItem1 = "priority" 并且优先级有两个值:HIGH 和 NORMAL,并且 List 的所有优先级都是 HIGH ,在这种情况下我需要按 orderItem2 排序
  • 好的,那么我的答案应该对你有用

标签: java arrays list sorting compare


【解决方案1】:

我们可以根据您的情况使用 java.lang.reflect.Field:

// OrderItem  can be detrmined at runtime based on your logic
String orderItem = "priority"; 

Comparator<Processitems> comparator = new Comparator<Processitems>(){
    public int compare(Processitems p1, Processitems p2){
        try {
            Field processItem = p1.getClass().getField(orderItem);
            Comparable<Object> comparablep1
                = (Comparable<Object>) processItem.get(p1);
            Comparable<Object> comparablep2
                = (Comparable<Object>) processItem.get(p2);

            return comparablep1.compareTo(comparablep2);

        } catch(Exception e) {
            throw new RuntimeException(
                          "No field present with " + orderItem, e);
        }
    };
}

【讨论】:

    【解决方案2】:

    您可以做的一件事是向OrderItems 添加一个方法,为您构建适当的Comparator 对象。我们就叫它getComparator吧。

    由于您有两个要排序的字段 - orderItem1 和 orderItem2 - 创建一个帮助方法来为您要传入的任何字段创建一个比较器是很有用的。

    然后你可以用它来创建两个比较器并将它们组合在一起,或者做任何你想做的事情。

    public class OrderItems {
        private String orderItem1;
        private String orderItem2;
    
        private Comparator<Processitems> createComparatorForField(String field) {
            switch (field) {
                case "priority": return Comparator.comparing(p -> p.priority);
                case "date": return Comparator.comparing(p -> p.date);
                case "status": return Comparator.comparing(p -> p.status);
            }
            throw new IllegalArgumentException(field);
        }
        
        Comparator<Processitems> getComparator() {
            if (orderItem1 != null) {
              Comparator<Processitems> order1 = createComparatorForField(orderItem1);
              Comparator<Processitems> order2 = createComparatorForField(orderItem2);
              return order1.thenComparing(order2);
            }
            else return createComparatorForField(orderItem2);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 2021-01-23
      • 2013-08-10
      相关资源
      最近更新 更多