Java按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序

Posted

技术标签:

【中文标题】Java按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序【英文标题】:Java sort array of objects by integer field and if those are identical then sort by another integer value 【发布时间】:2021-02-02 13:18:32 【问题描述】:

我也有一个 java 问题,涉及对对象数组列表进行排序。

我已经想出了按特定字段对对象的arrayList进行排序,可以在下面的代码中看到

public void printPrioritized() 
    System.out.println("Prioritized todo:");
    System.out.println("-----------------");
    List<Task> sortedList = new ArrayList<Task>(taskList);

    Collections.sort(sortedList, new Comparator<Task>() 
        public int compare(Task o1, Task o2) 
            return Integer.valueOf(o1.getPriority()).compareTo(o2.getPriority());
        
    );

    sortedList.forEach((e) -> 
        System.out.println(e);
    );

我的问题是,如果对象字段相同,那么我应该按另一个值排序。这意味着我必须按 1 到 4 的值排序(getPriority() 方法),但如果两个对象都为 2,那么我必须按另一个值排序,例如时间。希望有人能帮忙。

【问题讨论】:

【参考方案1】:

尝试自定义compare 方法。 例如

if(o1.getPriority() != o2.getPriority()) 
   return Integer.valueOf(o1.getPriority()).compareTo(o2.getPriority());

if(o1.getTime() != o2.getTime())
   return Integer.valueOf(o1.getTime()).compareTo(o2.getTime());

return 0; //they are equal with all fields

【讨论】:

【参考方案2】:

假设您的 Task 类看起来像:

class Task 
    int priority;
    int anotherValue;
    // getters, setters ...

您可以创建自定义比较器并在排序时将它们链接起来,例如:

List<Task> myList = new ArrayList<>();

Comparator<Task> byPriority = (t1,t2) -> Integer.compare(t1.getPriority(), t2.getPriority());
Comparator<Task> byAnotherValue = (t1,t2) -> Integer.compare(t1.getAnotherValue(), t2.getAnotherValue());

myList.sort(byPriority.thenComparing(byAnotherValue));

或 你可以结合这些排序 ->

List<Task> myList = new ArrayList<>();

Comparator<Task> sortedComparator = (t1,t2) -> 
    if (t1.getPriority() != t2.getPriority()) 
        return Integer.compare(t1.getPriority(), t2.getPriority()); 
    
    else if (t1.getAnotherValue() != t2.getAnotherValue()) 
        return Integer.compare(t1.getAnotherValue(), t2.getAnotherValue());
    
;

myList.sort(sortedComparator);

【讨论】:

不错!如何进一步简化它:myList.sort(Comparator.comparingInt(Task::getPriority) .thenComparingInt(Task::getAnotherValue));

以上是关于Java按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序的主要内容,如果未能解决你的问题,请参考以下文章

按对象字段对对象数组进行排序

如何按多个字段对对象数组进行排序?

首先按字母顺序对对象数组进行排序,然后按数字排序

对JavaScript对象数组按指定属性和排序方向进行排序

Javascript - 如何按 3 种不同的属性类型对对象数组进行排序? (字符串、整数、布尔值)

如何按相同的索引对两个数组进行排序?