V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Red998
V2EX  ›  程序员

大佬们问个排序问题

  •  
  •   Red998 · 2022-04-20 12:23:47 +08:00 · 1781 次点击
    这是一个创建于 708 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已知字段 A 、B 、C 、D 都有值。按照以下优先级进行排序,相同的则向下取一个排序

    1.A 值=0 并且 B 的值最大

    2.A 值=1 并且 C 的值大

    3.A 值 =0 并且 D 的值大

    4.A 值 =1 并且 D 的值 怎么合并起来排序

    15 条回复    2022-04-22 00:28:46 +08:00
    yuelang85
        1
    yuelang85  
       2022-04-20 12:39:18 +08:00
    做一个临时字段:sort_index ,值等于你这个逻辑中的序号( 1 ,2 ,3 ,4 ),按照 sort_index 排序
    Red998
        2
    Red998  
    OP
       2022-04-20 13:00:34 +08:00
    @yuelang85 可能我没描述清楚 。 序号都是排序条件从大到小倒叙, 序号都是条件
    比如 有个 List 排序 对象中 A 字段值等于 0 和 B 字段值从大到小排序 , A 字段值=0 并且 C 的值从大到小排序,A 字段值=1 并且 D 的值从大到小排序 , A 字段值=1 并且 D 的值。 相同就取下一个规则
    thunderw
        3
    thunderw  
       2022-04-20 13:21:59 +08:00
    你能拿 ABCD 算一个分数出来按分数排序吗?感觉看了你的描述,不理解你的 2 和 3 什么关系。
    jjwjiang
        4
    jjwjiang  
       2022-04-20 13:36:05 +08:00
    不就是一个自定义比较器吗?把你的逻辑写在里面传给排序不就好了

    排序本质就是 2 个元素如何比较

    不过你这个逻辑感觉描述的很混乱,A 值=0 ,指的是比较的 2 个对象的值 A 都是 0 还是有一个为 0 ?
    twing37
        5
    twing37  
       2022-04-20 13:43:29 +08:00
    描述太过混乱.
    给出示例: 输入 输出
    edward1987
        6
    edward1987  
       2022-04-20 13:50:23 +08:00
    放弃理解,这描述写的啥跟啥,主题和#2 的描述根本对不上。。
    MoYi123
        7
    MoYi123  
       2022-04-20 13:56:24 +08:00
    建议放弃抽象的描述,实际一点, 把这几个例子答案是什么, 怎么算的说一下吧

    A=0,B=9,C=4,D=5
    A=0,B=3,C=10,D=5
    A=1,B=3,C=4,D=13
    A=1,B=3,C=4,D=5
    huring
        8
    huring  
       2022-04-20 14:43:38 +08:00
    我看了 5 分钟,实在是没能理解题目,太过抽象了,起码要不先比较 A 的值,A 相同了再比较 B....这个太抽象了
    darkengine
        9
    darkengine  
       2022-04-20 14:43:56 +08:00
    我尝试猜一下啊,需要排序的 List 里都是对象,这些对象的定义可以简化为:
    {
    A: Number,
    B: Number,
    C: Number,
    D: Number,
    }
    现在需要按照 op 给的规则给 List 里的对象排序,对吧?
    albertni
        10
    albertni  
       2022-04-20 14:50:49 +08:00 via Android
    写个两个元素之间的比较器不就完了
    Jtyczc
        11
    Jtyczc  
       2022-04-20 14:58:15 +08:00
    参考#2 咯,
    做一个临时字段:sort_index 吧

    比如:
    1 、先取出第一种情况,计算 sort_index

    A 值=0 并且 B 的值最大,sort_index 等于 1
    A 值=0 并且 B 的值排行第二,sort_index 等于 2
    ……
    A 值=0 并且 B 的值排行 10 ,sort_index 等于 10

    2 、取出第二种情况
    A 值=1 并且 C 的值大,sort_index 等于 11
    ……

    3 、取出第三种情况……
    ……


    好了,最后只需要按 sort_index 从小到大排序就好
    ThreeK
        12
    ThreeK  
       2022-04-20 15:00:09 +08:00
    同意楼上的,既然描述不清楚,直接给几个例子
    Nich0la5
        13
    Nich0la5  
       2022-04-20 15:15:42 +08:00
    自定义个比较器就完事了 没看懂逻辑+1 op 的表述能力需要再提升下呀
    tusj
        14
    tusj  
       2022-04-20 15:45:04 +08:00
    int Score() {
    themax = Max(B, C, D);
    if (A == 0 && B == themax) return 1;
    // if (A == 0 && C == themax) return ? 不可能有此种情况?
    if (A == 0 && D == themax) return 3;
    // if (A == 1 && B == themax) return ? 不可能有此种情况?
    if (A == 1 && C == themax) return 2;
    if (A == 1 && D == themax) return 4;
    return 5;
    }

    bool Compare(l, r) {
    return l.Score() < r.Score();
    }
    yuelang85
        15
    yuelang85  
       2022-04-22 00:28:46 +08:00
    哥们儿,你的“并且”其实是想表达“则”吗?

    比如:”1.A 值=0 并且 B 的值最大“

    其实是想说:if A == 0 then sort by B ???
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3327 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:36 · PVG 21:36 · LAX 06:36 · JFK 09:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.