Zig stable multi-key sort with null scores
Zig
const std = @import("std");
const Row = struct { group: []const u8, score: ?u32 };
fn lessThan(_: void, a: Row, b: Row) bool {
if (!std.mem.eql(u8, a.group, b.group)) return std.mem.lessThan(u8, a.group, b.group);
if (a.score == null) return false;
if (b.score == null) return true;
return a.score.? > b.score.?;
}
pub fn main() void {
var rows = [_]Row{
.{ .group = "b", .score = 3 },
.{ .group = "a", .score = null },
.{ .group = "a", .score = 9 },
};
std.mem.sort(Row, &rows, {}, lessThan);
for (rows) |r| std.debug.print("{s} {?d}\n", .{ r.group, r.score });
}