ListUnique: Difference between revisions
No edit summary |
m →Function: list ListSortedAndUnique(list {{LSL Param|input}}, integer {{LSL Param|ascending}}): typo |
||
| (11 intermediate revisions by 7 users not shown) | |||
| Line 1: | Line 1: | ||
{{LSL Header}} __NOTOC__ | {{LSL Header}} __NOTOC__ | ||
<div id="box"> | <div id="box"> | ||
== Function: [[list]] ListUnique([[list]] {{LSL Param|lAll }}; == | == Function: [[list]] ListUnique([[list]] {{LSL Param|lAll) }}; == | ||
<div style="padding: 0.5em;"> | <div style="padding: 0.5em;"> | ||
Given a list of elements, strips out any duplicates in that list, and returns the de-duped list. | Given a list of elements, strips out any duplicates in that list, and returns the de-duped list. | ||
| Line 8: | Line 9: | ||
< | <source lang="lsl2"> | ||
list ListUnique( list lAll ) { | list ListUnique( list lAll ) { | ||
integer i; | integer i; | ||
list lFiltered = llList2List(lAll, 0, 0); | list lFiltered = llList2List(lAll, 0, 0); | ||
integer iAll = llGetListLength( lAll ); | integer iAll = llGetListLength( lAll ); | ||
for (i = 1; i < iAll; | for (i = 1; i < iAll; ++i) { | ||
if ( llListFindList(lFiltered, llList2List(lAll, i, i) ) == -1 ) { | if ( llListFindList(lFiltered, llList2List(lAll, i, i) ) == -1 ) { | ||
lFiltered += llList2List(lAll, i, i); | lFiltered += llList2List(lAll, i, i); | ||
| Line 21: | Line 22: | ||
} | } | ||
</ | </source> | ||
| Line 35: | Line 36: | ||
</div> | </div> | ||
Originated in a November 2004 thread led by Chromal Brodsky in the SL Scripting Forum. http://forums-archive.secondlife.com/54/30/28137/1.html | |||
</div> | |||
<div id="box"> | |||
== Function: [[list]] ListSortedAndUnique([[list]] {{LSL Param|input}}, [[integer]] {{LSL Param|ascending}}) == | |||
<div style="padding: 0.5em;"> | |||
If you don't need to maintain the order of items (or want them sorted anyway), the following code is consistently about 2x faster on short lists, and 3-5x faster on lists with hundreds of items. | |||
<source lang="lsl2">list ListSortedAndUnique(list input, integer ascending) { | |||
input = llListSort(input, 1, ascending); | |||
integer index; | |||
list last = llList2List(input, 0, 0); | |||
list result = last; | |||
for (index = 1 - llGetListLength(input); index < 0; ++index) { | |||
list current = llList2List(input, index, index); | |||
if (llListFindList(current, last) < 0) { | |||
last = current; | |||
result += last; | |||
} | |||
} | |||
return result; | |||
} | |||
</source> | |||
</div> | |||
The reason is that [[llListFindList]] performs a linear scan through the entire list, thus ListUnique compares every element with every other element. [[llListSort]] however compares each element only to a few others (the exact number depending on the sorting algorithm), and after sorting ListSortedAndUnique only compares neighboring elements. | |||
{{LSLC|Examples| | </div> | ||
{{LSLC|Examples|ListUnique}} | |||
{{LSLC|Examples|ListSortedAndUnique}} | |||
[[Category:LSL_User-Defined Functions]] | |||
Latest revision as of 13:29, 13 October 2025
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Function: list ListUnique(list lAll);
Given a list of elements, strips out any duplicates in that list, and returns the de-duped list.
See also: Lists
list ListUnique( list lAll ) {
integer i;
list lFiltered = llList2List(lAll, 0, 0);
integer iAll = llGetListLength( lAll );
for (i = 1; i < iAll; ++i) {
if ( llListFindList(lFiltered, llList2List(lAll, i, i) ) == -1 ) {
lFiltered += llList2List(lAll, i, i);
}
}
return lFiltered;
}
Example:
list mylist = ListUnique(["A", "A", "B", "C", "C", "B"])
would return the list:
["A", "B", "C"]
Originated in a November 2004 thread led by Chromal Brodsky in the SL Scripting Forum. http://forums-archive.secondlife.com/54/30/28137/1.html
Function: list ListSortedAndUnique(list input, integer ascending)
If you don't need to maintain the order of items (or want them sorted anyway), the following code is consistently about 2x faster on short lists, and 3-5x faster on lists with hundreds of items.
list ListSortedAndUnique(list input, integer ascending) {
input = llListSort(input, 1, ascending);
integer index;
list last = llList2List(input, 0, 0);
list result = last;
for (index = 1 - llGetListLength(input); index < 0; ++index) {
list current = llList2List(input, index, index);
if (llListFindList(current, last) < 0) {
last = current;
result += last;
}
}
return result;
}
The reason is that llListFindList performs a linear scan through the entire list, thus ListUnique compares every element with every other element. llListSort however compares each element only to a few others (the exact number depending on the sorting algorithm), and after sorting ListSortedAndUnique only compares neighboring elements.