在java中排序对象

我想做嵌套排序。 我有一个课程对象,它有一组应用程序。应用程序具有时间和优先级等属性。 现在我想先根据优先级对它们进行排序,并且在优先级内我想按时间对它们进行排序。

例如,给定此类(仅为简洁起见,公共字段):

public class Job { public int prio; public int timeElapsed; } 

您可以使用java.util.Collections类中的静态排序(List,Comparator)方法按时间实现排序。 这里,创建了一个匿名内部类来实现“作业”的比较器。 这有时被称为函数指针的替代(因为Java没有那些)。

 public void sortByTime() { AbstractList list = new ArrayList(); //add some items Collections.sort(list, new Comparator() { public int compare(Job j1, Job j2) { return j1.timeElapsed - j2.timeElapsed; } }); } 

记住compare()方法的契约模型: http : //java.sun.com/javase/6/docs/api/java/util/Comparator.html#compare (T,% 20T)

请参阅http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Ordering.html上的Google Collections订购课程。 它应该包含你需要的一切以及更多。 特别是你应该看看复合方法来获得第二次订购。

要对多个条件进行排序,可以使用Comparable接口进行一些常见的approches:

  • 编写compareTo()方法,以便比较一个字段,然后继续比较另一个字段,如果它不能返回基于第一个字段的排序;
  • 如果再次小心,在compareTo()方法中,您可以将两个条件的组合转换为一个可以比较的整数。

这些方法中的第一种通常是优选的并且更可能是正确的(即使代码最终看起来有点麻烦)。

请参阅我的网站上关于使Java对象可排序的示例,其中显示了根据套装中的套装编号对扑克牌进行分类的示例。

你已经在其他地方问了这个问题。 编写java.util.Comparator的实现。

如上例所示减去这两个数字并不总是一个好主意。

考虑如果将-2,147,483,644与2,147,483,645进行比较会发生什么。 减去它们会导致整数溢出 ,从而产生正数。 正数意味着比较国会声称-2,147,483,644大于2,147,483,645。

 -5 - 6 = -7 -2,147,483,644 - 2,147,483,645 = 1 

当您考虑比较long或double时,减去查找比较值会更加危险,因为必须将其转换为int,从而提供另一个溢出机会。 例如,永远不要这样做:

 class ZardozComparorator implements Comparator{ public int compare(Zardoz z1, Zardoz z2) { Long z1long = Long.getLong(z1.getName()); Long z2long = Long.getLong(z2.getName()); return (int)(z1long-z2long); } } 

而是使用您正在比较的对象的比较方法。 这样你就可以避免溢出,如果需要你可以覆盖compare方法。

 class ZardozComparorator implements Comparator{ public int compare(Zardoz z1, Zardoz z2) { Long z1long = Long.getLong(z1.getName()); Long z2long = Long.getLong(z2.getName()); return z1long.compareTo(z2long); } } 

以下是我对这个7年前的问题的看法,有时仍会报道:

  1. 在对象中创建一个静态方法(仅当您使用其他库来自动生成getter和setter时):
 public static String getNameFrom(Order order){ return order.name; } 

然后尝试使用这样的东西:

 Collections.sort(orders, Comparator.comparing(Order::getNameFrom)); 
  1. 对于更加elegand的方法,我总是不想改变实体,而是使用更高级的Lambdas编码。 例如:
 Collections.sort(orders, (order1, order2) -> order1.name.compareTo(order2.name);