如何从Range制作配对?

时间:2017-04-14 14:57:29

标签: grouping d

我有范围MySQLTablesRange。它包括如下数据: aa_1 aa_3 aa_2 bb_2 bb_1 bb_3

我需要创建像这样的对: aa_1 bb_1 aa_2 bb_2 aa_3 bb_3

std.algorithm方法group执行类似的操作,但我不知道如何在代码中编写它。我做了:

MySQLTablesRange.each!(a => a.split("_")[1].array.group.writeln);

但这是错误的,因为group适用于数组,但不适用于单个元素。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

更新:经过测试 - 我意识到它不是' group'你要。但是chunkBy。更新了答案以反映这一点。 https://dlang.org/phobos/std_algorithm_iteration.html#chunkBy

你必须告诉chunkBy如何分块数据......

[1,2,3,4,5,6]
    .sort!((a,b) => a%2 > b%2)        // separate odds n evens
    .chunkBy!((a,b) => a%2 == b%2);   // chunk them so all evens are in one range, odds in another.

这将创建两个组。一个是奇数,一个是平均数。

在您的情况下,您似乎将它们分组在' _'之后的文字上。在每个元素中。

"aa_1 aa_2 aa_3 bb_1 bb_2 bb_3 cc_1"
    .split(" ")
    .sort!((a,b) => a[$-1].to!int < b[$-1].to!int) // sort it so _1's are together, _2s are together. etc
    .chunkBy!((a,b) => a[$-1] == b[$-1]) // chunk them so they're in they're own range
    .each!writeln;   // print each range

$ rdmd test.d
["aa_1", "bb_1", "cc_1"]
["aa_2", "bb_2"]
["aa_3", "bb_3"]

理想情况下,您获得_的索引并在此之后进行比较......