sanshui_yangfei 2020-04-05 11:05 采纳率: 25%
浏览 198
已采纳

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 Qt 不小心删除了自带的类,该怎么办
    • ¥15 我需要在PC端 开两个抖店工作台客户端.(语言-java)
    • ¥15 有没有哪位厉害的人可以用C#可视化呀
    • ¥15 可以帮我看看代码哪里错了吗
    • ¥15 设计一个成绩管理系统
    • ¥15 PCL注册的选点等函数如何取消注册
    • ¥15 问一下各位,为什么我用蓝牙直接发送模拟输入的数据,接收端显示乱码呢,米思齐软件上usb串口显示正常的字符串呢?
    • ¥15 Python爬虫程序
    • ¥15 crypto 这种的应该怎么找flag?
    • ¥15 代码已写好,求帮我指出错误,有偿!