2017-04-14 54 views
0

我有範圍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

更新:經過測試 - 我意識到這不是'組'你想要的。但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. 

這將創建兩個組。一個用奇數,一個用evens。

就你而言,它看起來像你將它們放在每個元素中'_'之後的文本上。

"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"] 

理想情況下,你會得到的指數_,之後比較...

+0

而且會是什麼,如果我沒有aa_1,但aa_123?減$ 1會得到錯誤的結果... –

+0

是啊,這就是爲什麼我提到你爲了獲得'_'的索引並在此之後進行比較。我不能爲你寫這一切;) –