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按整数字段对对象数组进行排序,如果它们相同,则按另一个整数值排序的主要内容,如果未能解决你的问题,请参考以下文章