replaceRange method Null safety
override
Replaces a range of elements with the elements of replacement
.
Removes the objects in the range from start
to end
,
then inserts the elements of replacements
at start
.
var list = [1, 2, 3, 4, 5];
list.replaceRange(1, 4, [6, 7]);
list.join(', '); // '1, 6, 7, 5'
The provided range, given by start
and end
, must be valid.
A range from start
to end
is valid if 0 ≤ start
≤ end
≤ length.
An empty range (with end == start
) is valid.
The operation list.replaceRange(start, end, replacements)
is roughly equivalent to:
list.removeRange(start, end);
list.insertAll(start, replacements);
but may be more efficient.
The list must be growable.
This method does not work on fixed-length lists, even when replacement
has the same number of elements as the replaced range. In that case use
setRange instead.
Implementation
void replaceRange(int start, int end, Iterable<E> newContents) {
RangeError.checkValidRange(start, end, this.length);
if (start == this.length) {
addAll(newContents);
return;
}
if (newContents is! EfficientLengthIterable) {
newContents = newContents.toList();
}
int removeLength = end - start;
int insertLength = newContents.length;
if (removeLength >= insertLength) {
int insertEnd = start + insertLength;
this.setRange(start, insertEnd, newContents);
if (removeLength > insertLength) {
_closeGap(insertEnd, end);
}
} else if (end == this.length) {
int i = start;
for (E element in newContents) {
if (i < end) {
this[i] = element;
} else {
add(element);
}
i++;
}
} else {
int delta = insertLength - removeLength;
int oldLength = this.length;
int insertEnd = start + insertLength; // aka. end + delta.
for (int i = oldLength - delta; i < oldLength; ++i) {
add(this[i > 0 ? i : 0]);
}
if (insertEnd < oldLength) {
this.setRange(insertEnd, oldLength, this, end);
}
this.setRange(start, insertEnd, newContents);
}
}