首页 > 解决方案 > 使用 std.algorithm 从数组中保存已删除值的更好方法

问题描述

我需要从数组中删除第一个元素,该元素存在于第二个数组中。

浏览std.algorithm包,我可以使用findAmongand部分到达那里remove

但是有没有办法将这些结合起来,这样我既可以删除一个元素,又可以查看哪个元素被删除了?

例如:

// array that will have elements removed
auto targetStrings = ["a", "b", "c"];
// holder for element that will be removed
string removedString;
// array to match against, to determine what should be removed
auto removeStrings = ["b", "a"];

auto r = findAmong(targetStrings, removeStrings);
if (r.count > 0) {
  removedString = r[0];
  targetStrings = targetStrings.remove!(c => c == removedString);
}

writeln(removedString);
writeln(targetStrings);

标签: d

解决方案


您可以通过从原始范围的长度中减去返回的剩余范围的长度来获取元素的索引findAmong,然后只需remove与索引一起使用:

auto r = findAmong(targetStrings, removeStrings);
if (!r.empty)
{
    removedString = r.front;
    auto index = targetStrings.length - r.length;
    targetStrings = targetStrings.remove(index);
}

或者,直接使用以下命令获取索引countUntil

auto index = targetStrings.countUntil!(s => removeStrings.canFind(s));
if (index >= 0)
{
    removedString = targetStrings[index];
    targetStrings = targetStrings.remove(index);
}

推荐阅读