2014-09-05 3 views
6

Hauptfrage: Wie kann ich einen Artikel am schnellsten in eine Liste einfügen, die bereits mit Julia sortiert ist?Artikel in eine sortierte Liste mit Julia einfügen (mit und ohne Duplikate)

Derzeit ich dies tun:

v = [1, 2, 3, 5] #example list 
x = 4 #value to insert 
index = searchsortedfirst(v, x) #find index at which to insert x 
insert!(v, index, x) #insert x at index 

Bonus-Frage: Was passiert, wenn ich will keine Duplikate gleichzeitig gewährleisten?

Antwort

5

können Sie searchsorted verwenden Sie den Bereich von Indizes zu erhalten, wenn der Wert, anstatt nur die ersten auftritt und dann splice! verwenden, um die Werte in diesem Bereich mit einem neuen Satz von Werten zu ersetzen:

insert_and_dedup!(v::Vector, x) = (splice!(v, searchsorted(v,x), [x]); v) 

Das ist ein netter kleiner Einliner, der macht was du willst.

julia> v = [1, 2, 3, 3, 5]; 

julia> insert_and_dedup!(v, 4) 
6-element Array{Int64,1}: 
1 
2 
3 
3 
4 
5 

julia> insert_and_dedup!(v, 3) 
5-element Array{Int64,1}: 
1 
2 
3 
4 
5 

Das machte mir denken, dass splice! den Fall behandeln soll, wo der Ersatz ein einzelner Wert ist eher als ein Array, so dass ich kann dieses Feature hinzuzufügen.

+0

Danke, das ist sehr ordentlich. –

+0

Ich habe Spleiß gewechselt! Damit das Ersetzungsargument beliebig aufzählbar sein kann, einschließlich skalarer Werte: https://github.com/JuliaLang/julia/commit/e048f2bf1b8da56b07738c0a4d142cd29e140e98. Sie können nun 'insert_and_dedup! (V :: Vector, x) = (splice! (V, searchsorted (v, x), x); v)' stattdessen definieren. – StefanKarpinski

+1

Danke, und danke auch für all deine Arbeit an Julia. Ich liebe die Sprache. –

Verwandte Themen