Лучший способ сохранить удаленное значение из массива, используя алгоритм std.algorithm - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно удалить первый элемент из массива, который присутствует во втором массиве.

Просматривая пакет std.algorithm , я могу получить часть пути с findAmong и 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);

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете получить индекс элемента, вычтя длину оставшегося диапазона, возвращенного на 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);
}
...