如何从 Range 中配对?
How to make pairs from Range?
我有范围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
适用于数组,但不适用于单个元素。
有什么想法吗?
更新:测试后 - 我意识到这不是您想要的 'group'。但是大块。更新了答案以反映这一点。
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"]
理想情况下,您会获得 _ 的索引,然后进行比较...
我有范围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
适用于数组,但不适用于单个元素。
有什么想法吗?
更新:测试后 - 我意识到这不是您想要的 'group'。但是大块。更新了答案以反映这一点。 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"]
理想情况下,您会获得 _ 的索引,然后进行比较...