如何按某个属性对对象列表进行排序

2022-08-31 06:50:47

我有简单的类

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

和缺点。如何按升序排序,然后按?任何人都可以帮忙吗?我知道在通用算法和重载运算符<C++,但我是Java的新手。List<ActiveAlarm>timeStartedtimeEnded


答案 1

要么实现,要么在单独的类中实现。然后致电:ActiveAlarmComparable<ActiveAlarm>Comparator<ActiveAlarm>

Collections.sort(list);

Collections.sort(list, comparator);

一般来说,如果存在单个“自然”排序顺序,则最好实现Compeable<T>...否则(如果你碰巧想按特定顺序排序,但同样容易想要一个不同的顺序),最好实现Compolarator<T>。老实说,这种特殊情况可能会走向任何一种方式......但我可能会坚持使用更灵活的比较器<T>选项。

编辑:示例实现:

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 < b ? -1
         : a > b ? 1
         : 0;
  }
}

答案 2

使用比较器

例如:

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) -> { /* compute and return int */ });

推荐