当前位置: 首页 > 面试题库 >

用部分显式排序,然后再用另一种顺序?

濮献
2023-03-14
问题内容

我需要的是以自定义方式订购列表,我正在寻找正确的方式并找到了番石榴的Ordering
api,但事实是,我订购的列表并不总是相同,而我只需要2个字段位于列表的顶部,例如,我有这个:

List<AccountType> accountTypes = new ArrayList<>();
AccountType accountType = new AccountType();
accountType.type = "tfsa";
AccountType accountType2 = new AccountType();
accountType2.type = "rrsp";
AccountType accountType3 = new AccountType();
accountType3.type = "personal";
accountTypes.add(accountType3);
accountTypes.add(accountType2);
accountTypes.add(accountType);
//The order I might have is : ["personal", "rrsp", "tfsa"]
//The order I need is first "rrsp" then "tfsa" then anything else

我尝试使用自定义比较器并在Guava库中使用Ordering,如下所示:

public static class SupportedAccountsComparator implements Comparator<AccountType> {
    Ordering<String> ordering = Ordering.explicit(ImmutableList.of("rrsp", "tfsa"));
    @Override
    public int compare(AccountType o1, AccountType o2) {
        return ordering.compare(o1.type, o2.type);
    }
}

但这会引发异常,因为显式排序不支持您提供的列表中未包含的其他项,有没有办法进行部分显式排序?就像是:

Ordering.explicit(ImmutableList.of("rrsp", "tfsa")).anythingElseWhatever();

问题答案:

您不需要番石榴,您所需的一切都在Collections API中。

假设AccountType工具Comparable,你可以只提供一个Comparator对于返回最小值"tfsa""rrsp",但叶选到其余AccountType的默认比较:

Comparator<AccountType> comparator = (o1, o2) -> {
    if(Objects.equals(o1.type, "rrsp")) return -1;
    else if(Objects.equals(o2.type, "rrsp")) return 1;
    else if(Objects.equals(o1.type, "tfsa")) return -1;
    else if(Objects.equals(o2.type, "tfsa")) return 1;
    else return o1.compareTo(o2);
};
accountTypes.sort(comparator);

如果您不希望对其他项进行排序,只需提供一个默认比较器,该比较器始终返回0。



 类似资料:
  • 到目前为止,我做到了: 我的Ajax1函数返回ajax对象。我的等待函数看起来像这样: 问题是第二个ajax请求函数(Ajax2)并没有等待等待函数!编辑:我也试过: 什么也没变。从jQuery文档: 在将多个延迟对象传递给jQuery.when的情况下,该方法将从新的“master”返回promise“延迟对象,跟踪已传递的所有延迟的聚合状态。当所有延迟被解决时,该方法将立即解决其主延迟,或者当

  • 问题内容: 这与多级排序无关。 我需要首先根据距离选择结果,将结果限制为50,然后再按价格将这50结果排序。 本质上,第二种排序放弃了内部排序的顺序-但是内部排序用于磨练前50个结果。 对于此类问题,我看到的其他答案是第二级排序,这不是我想要的。 顺便说一句:我看过聚合-前N个结果,但不确定是否可以对聚合结果排序应用排序。也看过了,但我不知道将“分类”放在哪里 问题答案: 热门匹配汇总可让您根据主

  • 我有一个字段(比如color),它可以有四个值(红色、蓝色、黄色和绿色)之一。我想对它们进行排序,这样红色将有一个1的分数,所以所有的红色将在顶部,其次是蓝色,分数为2,黄色,分数为3等等。 如何为ElasticSearch中的排序分配这些手动评分?

  • 问题内容: 我看到在SQL中,GROUP BY必须在ORDER BY表达式之前。这是否意味着在分组丢弃相同的行/列之后就完成了排序? 因为我似乎需要首先按时间戳记列A对行进行排序,然后才丢弃列A中具有相同值的行。不知道如何完成此操作… 我正在使用MySQL 5.1.41 数据可以是: 我想要的结果是: 基本上,我想要B列中具有最新时间戳的行(请考虑ORDER BY),而A列中的每个值仅需要一行(请

  • 我是Java新手,我正在尝试使用Lambda表达式和比较器。我有一个具有其他getter和toString方法的公共类人员: 现在我想对一个Person[]列表进行排序,首先按String(降序)进行比较,然后按年龄(升序)进行比较,然后按计算机数量(降序)进行比较,最后按Salary(升序)进行比较。我无法实现可比较,因为如果我重写compareTo方法,它应该是升序或降序,我需要两者。我想知道

  • 在我的java项目中,我有以下文件夹: null 文件夹包含以下: 而包含以下: 我有什么办法来解决这个问题吗? null 其中是应用程序的风格,可以是或。 以便能够首先构建文件,然后构建我应用程序的apk。