sanshui_yangfei 2020-04-05 11:05 采纳率: 20%
浏览 199
已采纳

java集合Comparator接口实现排序问题

设计一个整数排序算法,规则很简单:
1、同为正数或者同为负数,小的排前,大的排后。
2、所有负数大于所有正数。所有正数排前,负数排后。
3、零最小。排最前。

直接上代码:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import org.junit.Test;

public class TestComparator {
    @Test
    public void testInt() {
        List<Integer> list=new ArrayList<Integer>();
        list.add(3222222);
        list.add(-1000);
        list.add(1000);
        list.add(1323235);
        list.add(-1065650);
        list.add(145466);
        list.sort(new Comparator<Integer>() {

            @Override
            public int compare(Integer o1, Integer o2) {
                if(o1*o2>0) {
                    return o1-o2;
                }else if(o1*o2<0){
                    return o2-o1;
                }else {
                    return o1==0?-1:1;
                }
            }

        });
        System.out.println(list);
    }
}

期望结果:1000 145466 1323235 3222222 -1000 -1065650
实际输出结果:[1000, 1323235, 145466, -1065650, -1000, 3222222]
我对compare函数返回值的理解是:

返回值为负数,两个比较对象不交换位置;
返回值为正数或0,两个比较对象交换位置;

是理解上存在问题,还是代码逻辑上存在问题?请各位指导。

  • 写回答

1条回答 默认 最新

  • 守得云开终见月明 2020-04-05 17:04
    关注

    只能指定一个比较规则吧,你这个要求貌似无法满足,可以查看源码,实际上是按数组的形式进行排序的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 9月18日

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?