如何使用Comparator对集合中的多个字段进行排序?

时间:2016-03-25 15:22:17

标签: java sql database comparator

我有这个查询,我为此写了一个DAL,基本上运行搜索条件,如果找到,将其添加到列表中。但我遇到的问题是根据字段对列表进行排序。

例如,

     select * from HELLO.TABLE Where total=? and max = ?
   ORDER BY FRLevel DESC, TransferLevel DESC, PriorLimitsLevel DESC

如何使用比较器对这些字段进行排序。这是我的Java代码,

public List<PgmTierCriteriaVO> getCriteriaListForAL(DriverVO driverVO,
        String productType, PolicyVersionVO policyVersionVO, String rateDate)
        throws Exception {

    String pgmCode = driverVO.getPgmCode().trim();
    String versionType = policyVersionVO.getVersionType().trim();
    String pgmCodeShort = pgmCode.substring(0, 5);

    PgmTierCriteriaID pgmTierCriteriaID = new PgmTierCriteriaID();
    pgmTierCriteriaID.setPgmCode(pgmCode);
    List<PgmTierCriteriaVO> pgmCriteriaVOList = pgmPayPlanService
            .getPgmTierCriteriaList(pgmTierCriteriaID);
    List<PgmTierCriteriaVO> pgmCriteriaVOListAL = new ArrayList<PgmTierCriteriaVO>();

    if (productType != null && rateDate != null) {
        if (productType.equalsIgnoreCase("PPA")) {

            for (PgmTierCriteriaVO pgmTierCriteriaVO : pgmCriteriaVOList) {
                if (pgmTierCriteriaVO.getAppliesToCode() != null) {

                    if ((StringUtil.getDate(rateDate).after(pgmTierCriteriaVO.getEffDate()) 
                        || StringUtil.getDate(rateDate).equals(pgmTierCriteriaVO.getEffDate()))
                        && StringUtil.getDate(rateDate).before(pgmTierCriteriaVO.getExpDate())
                        && (pgmTierCriteriaVO.getAppliesToCode().trim().equalsIgnoreCase("B") 
                        || pgmTierCriteriaVO.getAppliesToCode().trim().equalsIgnoreCase(versionType))) {
                        pgmCriteriaVOListAL.add(pgmTierCriteriaVO);
                    } else {
                        pgmCriteriaVOListAL = null;
                    }
                }
            }
        }

        else if (productType.equalsIgnoreCase("CV")) {

            for (PgmTierCriteriaVO pgmTierCriteriaVO : pgmCriteriaVOList) {
                if (pgmTierCriteriaVO.getAppliesToCode() != null) {

                    if ((StringUtil.getDate(rateDate).after(pgmTierCriteriaVO.getEffDate()) 
                        || StringUtil.getDate(rateDate).equals(pgmTierCriteriaVO.getEffDate()))
                            && StringUtil.getDate(rateDate).before(pgmTierCriteriaVO.getExpDate())
                            && pgmCodeShort.equalsIgnoreCase(pgmTierCriteriaVO.getPgmCode().substring(0, 5))
                            && (pgmTierCriteriaVO.getAppliesToCode().trim().equalsIgnoreCase("B") 
                            || pgmTierCriteriaVO.getAppliesToCode().trim().equalsIgnoreCase(versionType))) {
                        pgmCriteriaVOListAL.add(pgmTierCriteriaVO);
                    } else {
                        pgmCriteriaVOListAL = null;
                    }
                }
            }

        }
    }
    return pgmCriteriaVOListAL;
}

我需要返回已排序的列表而不仅仅是列表。

1 个答案:

答案 0 :(得分:1)

在java 8中,Comparator类采用了许多有用的方法,可以轻松地创建比较器和链式比较以及各种thenComparing选项。

如果你不能使用java 8,那么guava库提供了Ordering类,它提供了类似的功能。例如,compound方法提供了链接实例的能力,就像java 8中的thenComparing一样。