在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);
}
D语言实现数组去重函数:array_unique

原文地址: https://www.cveoy.top/t/topic/oiGE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录