如何根据某些属性对对象列表进行排序

我有一个简单的课程


public class ActiveAlarm {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;
}



List<activealarm>

骗子。 如何按升序排序
timeStarted

, 然后
timeEnded

? 有人可以帮忙吗? 我知道B. C++ 具有常用算法和过载运营商 &lt;,, 但我是新的 Java.
</activealarm>
已邀请:

龙天

赞同来自:

无论是制作
ActiveAlarm

执行
Comparable<activealarm>

, 无论是实施
Comparator<activealarm>

在一个单独的课堂上。 然后打电话:


Collections.sort/list/;


或者


Collections.sort/list, comparator/;


一般来说,这是实现的好主意
http://download.oracle.com/jav ... .html
, 如果有一种排序顺序 "natural"... 否则 /如果你

想要以一定的顺序排序,但有同样的缓解,你可以选择另一个顺序/ 更好地实现
http://download.oracle.com/jav ... .html
. 这种特殊情况可以朝着诚实的方向走,诚实......但我会

大概

, 遵守更灵活的版本
Comparator<t>

.

EDIT: 示例实现:


public class AlarmByTimesComparer implements Comparator<activealarm> {
@Override
public int compare/ActiveAlarm x, ActiveAlarm y/ {
// TODO: Handle null x or y values
int startComparison = compare/x.timeStarted, y.timeStarted/;
return startComparison != 0 ? startComparison
: compare/x.timeEnded, y.timeEnded/;
}

// I don't know why this isn't in Long...
private static int compare/long a, long b/ {
return a &lt; b ? -1
: a &gt; b ? 1
: 0;
}
}


</activealarm></t></activealarm></activealarm>

卫东

赞同来自:

使用
http://download.oracle.com/jav ... .html
例如

:


class Score {

private String name;
private List<integer> scores;
// +accessor methods
}



Collections.sort/scores, new Comparator<score>// {

public int compare/Score o1, Score o2/ {
// compare two instance of `Score` and return `int` as result.
return o2.getScores//.get/0/.compareTo/o1.getScores//.get/0//;
}
}/;


以。。。开始 Java 8, 你可以使用表达式 lambda 表示比较器实例。


Collections.sort/scores, /s1, s2/ -&gt; { /* compute and return int */ }/;


</score></integer>

裸奔

赞同来自:

JAVA 8 以上答案 /使用表达式

Lambda/

在 Java 8 介绍了表达式 Lambda, 让它变得更轻松! 而不是创建一个对象 Comparator// 通过其所有建筑林,您可以简化如下: /用你的对象作为一个例子/


Collections.sort/list, /ActiveAlarm a1, ActiveAlarm a2/ -> a1.timeStarted-a2.timeStarted/;


甚至更短:


Collections.sort/list, Comparator.comparingInt/ActiveAlarm ::getterMethod//;


这是一个陈述相当于以下内容:


Collections.sort/list, new Comparator<activealarm>// {
@Override
public int compare/ActiveAlarm a1, ActiveAlarm a2/ {
return a1.timeStarted - a2.timeStarted;
}
}/;


考虑表达式 Lambda 关于您只需要将其放在代码的适当部分中:方法的签名以及返回的内容。

您的问题的另一部分是关于如何与几个字段进行比较。 用表达式做 Lambda, 您可以使用该功能
.thenComparing//

有效地结合了两个比较:


Collections.sort/list, /ActiveAlarm a1, ActiveAlarm a2/ -&gt; a1.timeStarted-a2.timeStarted 
.thenComparing //ActiveAlarm a1, ActiveAlarm a2/ -&gt; a1.timeEnded-a2.timeEnded/
/;


上面的代码首先对列表进行排序
timeStarted

, 然后是
timeEnded

/对于那些具有相同的记录
timeStarted

/.

最后一注:易于比较 'long' 或者 'int' 原语,你可以简单地减去另一个。 如果你比较对象 /'Long' 或者 'String'/, 我建议你使用它的内置比较。 例子:


Collections.sort/list, /ActiveAlarm a1, ActiveAlarm a2/ -&gt; a1.name.compareTo/a2.name/ /;


EDIT: 谢谢Lucas Edrie告诉我这个功能
.thenComparing//

.
</activealarm>

喜特乐

赞同来自:

我们可以将列表排序两种方式之一。

:

1. 使用比较器

: 如有必要,请在几个地方使用排序逻辑
如果要在一个地方使用排序逻辑,则可以如下写匿名内部类,或删除比较器并在几个位置使用它


Collections.sort/arrayList, new Comparator<activealarm>// {
public int compare/ActiveAlarm o1, ActiveAlarm o2/ {
//Sorts by 'TimeStarted' property
return o1.getTimeStarted//<o2.gettimestarted ?-1:o1.gettimestarted=""></o2.gettimestarted>o2.getTimeStarted//?1:doSecodaryOrderSort/o1,o2/;
}

//If 'TimeStarted' property is equal sorts by 'TimeEnded' property
public int doSecodaryOrderSort/ActiveAlarm o1,ActiveAlarm o2/ {
return o1.getTimeEnded//<o2.gettimeended ?-1:o1.gettimeended=""></o2.gettimeended>o2.getTimeEnded//?1:0;
}
}/;


我们可以问 null 如果我们可以使用,请检查属性 'Long' 反而 'long'.

2. 使用可比性 /自然秩序/

: 如果排序算法始终遵守一个属性:
写一个实现方法的类 'Comparable' 并重新定义方法 'compareTo', 如下所定义


class ActiveAlarm implements Comparable<activealarm>{

public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;

public ActiveAlarm/long timeStarted,long timeEnded/ {
this.timeStarted=timeStarted;
this.timeEnded=timeEnded;
}

public long getTimeStarted// {
return timeStarted;
}

public long getTimeEnded// {
return timeEnded;
}

public int compareTo/ActiveAlarm o/ {
return timeStarted<o.gettimestarted ?-1:timestarted="">o.getTimeStarted//?1:doSecodaryOrderSort/o/;
}

public int doSecodaryOrderSort/ActiveAlarm o/ {
return timeEnded<o.gettimeended ?-1:timeended="">o.getTimeEnded//?1:0;
}


}

基于自然组织调用排序的排序方法


Collections.sort/list/;


</o.gettimeended></o.gettimestarted></activealarm></activealarm>

莫问

赞同来自:

在 java8+ 这可以用一行写入如下,

collectionObjec.sort/comparator_lamda/ 或比较/CollectionType::getterOfProperty/

代码 :


ListOfActiveAlarmObj.sort//a,b->a.getTimeStarted//.compareTo/b.getTimeStarted/////


或者


ListOfActiveAlarmObj.sort/Comparator.comparing/ActiveAlarm::getTimeStarted//

涵秋

赞同来自:

public class ActiveAlarm implements Comparable<activealarm> {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;

public int compareTo/ActiveAlarm a/ {
if / this.timeStarted &gt; a.timeStarted /
return 1;
else if / this.timeStarted &lt; a.timeStarted /
return -1;
else {
if / this.timeEnded &gt; a.timeEnded /
return 1;
else
return -1;
}
}


它应该给你一个近似的观点。 完成后,您可以打电话
Collections.sort//

在列表中。
</activealarm>

詹大官人

赞同来自:

以。。。开始 Java8 这可以使用组合来完成
http://download.oracle.com/jav ... .html

https://docs.oracle.com/javase ... .html
例如

:


class Student{

private String name;
private List<score> scores;

// +accessor methods
}

class Score {

private int grade;
// +accessor methods
}



Collections.sort/student.getScores//, Comparator.comparing/Score::getGrade/;


</score>

小明明

赞同来自:

https://google.github.io/guava ... .html
番石榴岛 :


Collections.sort/list, new Comparator<activealarm>//{
@Override
public int compare/ActiveAlarm a1, ActiveAlarm a2/ {
return ComparisonChain.start//
.compare/a1.timestarted, a2.timestarted/
//...
.compare/a1.timeEnded, a1.timeEnded/.result//;
}}/;


</activealarm>

莫问

赞同来自:

您可以使用
http://download.oracle.com/jav ... .List,%20java.util.Comparator%29
并转移自己
http://download.oracle.com/jav ... .html

风见雨下

赞同来自:

在 java 您需要使用静态方法
Collections.sort

. 以下是对象列表的示例 CompanyRole, 首先排序开始,然后到最后。 您可以轻松适应您自己的对象。


private static void order/List<textcomponent> roles/ {

Collections.sort/roles, new Comparator// {
@Override
public int compare/Object o1, Object o2/ {
int x1 = //CompanyRole/ o1/.getBegin//;
int x2 = //CompanyRole/ o2/.getBegin//;

if /x1 != x2/ {
return x1 - x2;
} else {
int y1 = //CompanyRole/ o1/.getEnd//;
int y2 = //CompanyRole/ o2/.getEnd//;
return y2 - y1;
}
}
}/;
}


</textcomponent>

江南孤鹜

赞同来自:

你可以打电话 Collections.sort// 并转移到比较器,您需要写入以比较对象的各种属性。

快网

赞同来自:

如上所述,您可以排序:

制作一个人的实现对象
Comparable


或传递
Comparator


Collections.sort


如果你做两者,那么
Comparable

将被忽略,
Comparator

将会被使用。 它有助于物体 value 有自己的逻辑
Comparable

, 这是您对象最合理的排序 value, 虽然每个人都有自己的实施。

要回复问题请先登录注册