2017-05-03 6 views
1

Ich habe bekam Reihe von int ‚s in tracksList_filtered Variable: [10422, 10681, 10421, 10392, 10616, 10589, 10581, 10423, 10743, 10213, 10613, 10609, 10427, 10484, 10031, 10169, 10695, 10580, 10171, 10703, 10486, 10631, 10642, 10137, 10566, 10704, 10420, 10525, 10209, 10658, 10617, 10127, 10128, 10391, 10602, 10587, 10030, 10393, 10660, 10614, 10485, 10523, 10215, 10029, 10655, 10210, 10659, 10041, 1075, 10425, 10724, 1068, 10657, 10216, 10662, 10211, 10410, 10601, 10644, 10212, 10074, 10696, 10424, 10208, 1074, 10394, 10419, 10426, 10705, 10038, 10661, 10040, 10165, 10396, 10168, 10653, 10610] So entfernen Sie Elemente aus dem Array in D

ich von ihm 10422, 10681, 10421 (nicht durch den Index) entfernen müssen.

Ich schrieb nächsten Code:

auto tracksList_filtered = result.array.map!(a => a[0].coerce!int); 
writeln(tracksList_filtered); 
auto x = tracksList_filtered.array.remove(10422, 10681, 10421); 
writeln(x); 

Es ist verknallt mit Fehler: range is smaller than amount of items to pop

Beispiel aus docs sagt:. „Mehrere Indizes können in Entfernen übergeben werden in diesem Fall Elemente an den jeweiligen Indizes sind alle entfernt. Die Indizes müssen in aufsteigender Reihenfolge übergeben werden, sonst tritt eine Ausnahme auf. "

int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 
assert(remove(a, 1, 3, 5) == [ 0, 2, 4, 6, 7, 8, 9, 10 ]); 

Ich habe versucht, es zu überprüfen und platzierte Elemente in aufsteigender Reihenfolge zu entfernen:

auto x = tracksList_filtered.array.remove(1068,1074); 

aber bekam gleiche Ausnahme.

+1

Indizes der Schlitz in der Anordnung sind, nicht der Wert im Array. Benötigen Sie das Array in der gleichen Reihenfolge oder nicht? –

+0

Egal. –

Antwort

3

@ user1432751 Vorschlag von setDifference ist eine gute Option, aber wenn Sie wollen Ihre Listen nicht sortieren könnten Sie tun:

auto vals = [1,2,3,4,5,6]; 
auto toRemove = [2,3,5]; 
auto res = vals.remove!(x => toRemove.canFind(x)); 
assert(res == [1,4,6]); 
1

Was Sie sind Werte im Array, nicht Indizes, so dass Sie das Prädikat Version entfernen verwenden möchten:

http://dlang.org/phobos/std_algorithm_mutation.html#.remove.2

So

versuchen
your_array = your_array.remove!((a) => (a == 10422 || a == 10681 || a == 10421)); 

so das Prädikat Sie passieren vergleicht die Werte mit denen, die Sie entfernen möchten.

+0

Ich muss ein Array von einem anderen ausschließen können. Es ist keine Lösung für mich, Elemente manuell zu entfernen :( –

+0

Dieses Prädikat ist eine Funktion. Sie können tun, was auch immer Sie wollen, einschließlich der Überprüfung, ob der Wert in einem anderen Array ist. –

2

Das Problem wird gelöst mit setDifference

auto x = setDifference(tracksList_filtered.sort(), [1068, 1074, 1075].sort()); 

Elements Muss sortiert werden.

Verwandte Themen