2009-05-01 84 views
2

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

回答

8

例如,假定这个类(公共领域仅仅为了节省):

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

你可能实现使用java.util.Collections类中的静态排序(列表,比较)方法按时间排序。在这里,创建一个匿名的内部类来实现“Job”比较器。这有时被称为函数指针的替代(因为Java没有这些)。

public void sortByTime() { 
    AbstractList<Job> list = new ArrayList<Job>(); 
    //add some items 
    Collections.sort(list, new Comparator<Job>() { 
     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)

1

您已经在其他地方提问。编写一个java.util.Comparator的实现。

3

排序多个标准,使用可比接口一对夫妇共同approches的:

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

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

请参阅我的网站making Java objects sortable上的示例,其中显示了在诉讼中按照套装排序扑克牌的示例。

1

减去上述example中的两个数字并不总是一个好主意。

请考虑如果您将-2,147,483,644与2,147,483,645进行比较,会发生什么情况。减去它们会导致一个整数overflow,因此是一个正数。正数意味着会导致比较者声称-2,147,483,644大于2,147,483,645。

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

减去找到比较值是更加危险的,当你考虑比较多头或双打,因为这必须被转换回整数提供溢出另一个机会。例如,从不这样做:

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


     return (int)(z1long-z2long); 
    } 

} 

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

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


     return z1long.compareTo(z2long); 
    } 

} 
1

这里是我的这个7岁的疑问,仍然得到有时报道的意见:

  1. 使静态方法,你的对象一样(只有当你使用其他库自动生成getter和setter) :
public static String getNameFrom(Order order){ 
    return order.name; 
} 

然后尝试使用是这样的:

Collections.sort(orders, Comparator.comparing(Order::getNameFrom)); 
  • 为了更elegand方法,我总是喜欢不改变实体,但与lambda表达式使用更先进的编码。例如:
  • Collections.sort(orders, (order1, order2) -> 
    order1.name.compareTo(order2.name);