java中的对象排序

java中的对象排序,java,Java,我想做嵌套排序。我有一个课程对象,它有一组应用程序。应用程序有时间和优先级等属性。现在我想先根据优先级对它们进行排序,在优先级范围内,我想按时间对它们进行排序。您已经在其他地方问过这个问题。编写java.util.Comparator的一个实现。查看位于的Google Collections Ordering类。它应该有你需要的一切,再加上更多。特别是,您应该查看复合方法以获得第二次排序。例如,给定此类(仅为简洁起见,公共字段): 您可以在java.util.Collections类中使用静态排

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

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

查看位于的Google Collections Ordering类。它应该有你需要的一切,再加上更多。特别是,您应该查看复合方法以获得第二次排序。

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

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

public void sortByTime(){
AbstractList=新的ArrayList();
//添加一些项目
Collections.sort(list,newcomparator(){
公共整数比较(作业j1、作业j2){
返回j1.TimeAppeased-j2.TimeAppeased;
}
});
}

请注意compare()方法的契约模型:

要根据多个标准进行排序,请使用Compariable接口使用两种常用方法:

  • 编写compareTo()方法,使其比较一个字段,如果无法返回基于第一个字段的排序,则继续比较另一个字段
  • 如果再仔细一次,在compareTo()方法中,可以将两个条件的组合转换为一个整数,然后进行比较
这些方法中的第一种通常更可取,也更可能是正确的(即使代码看起来有点麻烦)


请参阅我的网站上的示例,其中显示了按套装和套装中的数字对扑克牌进行排序的示例。

将上述两个数字相减并不总是一个好主意

考虑一下如果将-2147483644与2147483645进行比较会发生什么。减去它们将得到一个整数,从而得到一个正数。正数表示将导致比较器声明-2147483644大于2147483645

-5 - 6 = -7
-2,147,483,644 - 2,147,483,645 = 1
当你考虑比较长或双倍时,减去找到比较值甚至更危险,因为这必须被重新投给int,从而提供另一个溢出的机会。例如,永远不要这样做:

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);
    }

}
类ZardozComparator实现比较器{ 公共整数比较(Zardoz z1,Zardoz z2){ Long z1long=Long.getLong(z1.getName()); Long z2long=Long.getLong(z2.getName()); 返回(int)(z1long-z2long); } } 而是使用正在比较的对象的比较方法。这样可以避免溢出,如果需要,可以重写compare方法

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);
    }

}
类ZardozComparator实现比较器{ 公共整数比较(Zardoz z1,Zardoz z2){ Long z1long=Long.getLong(z1.getName()); Long z2long=Long.getLong(z2.getName()); 返回z1long.compareTo(z2long); } }
以下是我对这个7年前的问题的看法,这个问题有时仍会被报道:

  • 在对象中创建一个静态方法,如(仅当使用其他库自动生成getter和setter时):
  • 然后试着用这样的方法:

  • 对于更简单的方法,我始终不希望更改实体,而是使用更高级的Lambdas编码。例如:
  • 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);
        }
    
    }
    
    public static String getNameFrom(Order order){
        return order.name;
    }
    
    Collections.sort(orders, Comparator.comparing(Order::getNameFrom));
    
    Collections.sort(orders, (order1, order2) ->
    order1.name.compareTo(order2.name);