D语言实现数组去重函数:array_unique
在D语言中,当你使用类似unique.values的语法时,编译器会将其解释为values(unique),即将unique作为参数传递给values函数。因此,在你的代码中,unique应该是一个对象而不是数组。你可以使用std.array.array函数将一个已有的数组转换成一个对象,然后再使用values函数。修改后的代码如下:
import std.stdio;
import std.algorithm;
import std.array;
import std.range;
import std.conv:to;
enum SortFlag { SORT_REGULAR = 0, SORT_NUMERIC, SORT_STRING, SORT_LOCALE_STRING }
// array_unique 函数
T[K] array_unique(K,T)(auto ref T[K] arr, SortFlag flag = SortFlag.SORT_STRING)
{
T[K] unique;
foreach (key, value; arr)
{
bool shouldAdd;
switch (flag)
{
case SortFlag.SORT_NUMERIC: // 按数字对比元素
shouldAdd = !unique.values.canFind!(a => a.to!real == value.to!real);
break;
case SortFlag.SORT_STRING: // 按字符串对比元素
shouldAdd = !unique.values.canFind!(a => a.to!string == value.to!string);
break;
case SortFlag.SORT_LOCALE_STRING: // 根据当前区域设置按字符串对比元素
// 暂不支持 SORT_LOCALE_STRING
break;
default: // 比较元素,不更改类型
shouldAdd = !unique.values.canFind!(a => a == value);
break;
}
if (shouldAdd)
{
unique[array(value)] = value; // 将值作为键插入对象
}
}
return unique;
}
T[] array_unique(T)(auto ref T[] arr, SortFlag flag = SortFlag.SORT_STRING)
{
T[] unique;
foreach (key, value; arr)
{
bool shouldAdd;
switch (flag)
{
case SortFlag.SORT_NUMERIC: // 按数字对比元素
shouldAdd = !unique.values.canFind!(a => a.to!real == value.to!real);
break;
case SortFlag.SORT_STRING: // 按字符串对比元素
shouldAdd = !unique.values.canFind!(a => a.to!string == value.to!string);
break;
case SortFlag.SORT_LOCALE_STRING: // 根据当前区域设置按字符串对比元素
// 暂不支持 SORT_LOCALE_STRING
break;
default: // 比较元素,不更改类型
shouldAdd = !unique.values.canFind!(a => a == value);
break;
}
if (shouldAdd)
{
unique ~= value; // 将值添加到数组末尾
}
}
return unique;
}
void main()
{
// 测试例子 1
string[int] input1 = [ 0 : "green", 1 : "red", 2 : "green", 3 : "blue", 4 : "red" ];
auto result1 = array_unique(input1);
writeln(result1); // 输出: [green(0), red(1), blue(3)]
// 测试例子 2
int[string] input2 = ["4": 4, "4_str": 4, "3": 3, "3_str": 3];
auto result2 = array_unique(input2, SortFlag.SORT_NUMERIC);
writeln(result2); // 输出: ["4": 4, "3": 3]
string[] input3 = ["hello","wolrd","hello"];
auto result3 = array_unique(input3);
writeln(result3);
}
原文地址: https://www.cveoy.top/t/topic/oiGE 著作权归作者所有。请勿转载和采集!