Java-如果返回值为零,比较器如何工作?

问题描述

我正在尝试用Java编写一个tiebreaker方法,该方法将根据Comparator中的值返回一个条目。这是抽象方法:

protected abstract Comparator<Map.Entry<Team,Stats>> getLeagueTableEntryComparator();

现在,我想根据得分,然后是目标差,然后是进球来区分条目。这是一个单独的类中的重写方法,通过适当的字段进行比较:

  @Override
    protected Comparator<Map.Entry<Team,Stats>> getLeagueTableEntryComparator() {

        return (Map.Entry<Team,Stats> teamStatsEntryOne,Map.Entry<Team,Stats> teamStatsEntryTwo) -> {

            int compare = Integer.compare(teamStatsEntryOne.getValue().getPoints(),teamStatsEntryTwo.getValue().getPoints());

            if (compare == 0) {

                compare = Integer.compare(teamStatsEntryOne.getValue().getTotalGoalDifference(),teamStatsEntryTwo.getValue().getTotalGoalDifference());

                if (compare == 0) {

                    compare = Integer.compare(teamStatsEntryOne.getValue().getGoalsFor(),teamStatsEntryTwo.getValue().getGoalsFor());

            }

            return compare;

        };
   }
}

但是,很明显compare甚至在比较了每个字段之后,最终都可能为零。

我的问题是-如果结尾comparator=0,比较器的实际行为是什么?我是否需要在末尾编写一个数字生成器,以在两个条目之间实现“真”随机50/50选择?

解决方法

如果比较器返回0,则认为这两个条目是等效的。然后由您决定如何处理此知识-您可以在两个等效元素之间随机选择,也可以对每个元素进行相同的处理(例如,在此用例中,如果两个团队彼此无法区分,则您可以决定在他们之间随机选择,宣布他们为共同冠军,甚至决定他们应该参加决胜局游戏。

请注意,尽管如此,您绝对不应在比较器的代码中引入随机部分-这将导致比较器的行为不确定,并违反一般的比较器合同。

,

比较器返回0时发生的行为取决于您如何使用比较器

如果您使用比较器对Collections.sortList.sort进行列表排序,则比较器返回0表示sort应该使项目保持原始顺序。

在这种情况下,如果要随机排序,可以使用Collections.shuffle对列表进行重新排序,然后再对其进行排序。这样可以保证所有“等价”商品都有相同的机会首先出现。

Collections.shuffle(list);
Collections.sort(list,comparator);
Object winner = list.get(0);

相反,如果您只有两个项目要比较,则可以直接调用compare,如果结果为零,则可以按照您希望的任何方式断开联系。例如,对于随机选择,您可以使用Random类的实例。

int compare = comparator.compare(a,b);
Random rnd = new Random();
if (compare == 0) {
    if (rnd.nextBoolean()) {
        winner = a;
    } else {
        winner = b;
    }
}
,

compare = 0表示对象相等,无需交换(排序)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...