replaceRange 方法
override
使用 replacements
中的元素替换一系列元素。
从 start
到 end
的范围内的对象被移除,然后在 start
处插入 replacements
中的元素。
final numbers = <int>[1, 2, 3, 4, 5];
final replacements = [6, 7];
numbers.replaceRange(1, 4, replacements);
print(numbers); // [1, 6, 7, 5]
提供的范围(由 start
和 end
确定)必须是有效的。当 0 ≤ start
≤ end
≤ 长度 时,从 start
到 end
的范围是有效的。一个空范围(其中 end == start
)是有效的。
操作 list.replaceRange(start, end, replacements)
大约等同于
final numbers = <int>[1, 2, 3, 4, 5];
numbers.removeRange(1, 4);
final replacements = [6, 7];
numbers.insertAll(1, replacements);
print(numbers); // [1, 6, 7, 5]
但可能更有效。
列表必须是可增长的。此方法不适用于固定长度的列表,即使 replacements
中元素的数量与被替换的范围相同。在这种情况下,请改用 setRange。
实现
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);
}
}