Dart リスト(配列)の範囲を指定して値を置換する

Dart リスト(配列)の範囲を指定して値を置換する

Dartで、リスト(配列)の範囲を指定して値を置換するコードを記述してます。「replaceRange」で開始位置と終了位置と置換する値を指定することで置換できます。また、「replaceRange」は範囲外の位置、「const」を指定したリストに対して実行するとエラーが発生します。

環境

  • OS windows11 home
  • Dart 2.18.1

範囲を指定して値を置換

範囲を指定して値を置換するには「replaceRange」を使用します。

リスト.replaceRange(開始位置,終了位置,[置換するリスト])

※ 終了位置の1つ前の位置までが削除されます

実際に使用して、範囲を指定して値を置換してみます。

void main() {
  var list = ['aaa', 'bbb', 'ccc', 'ddd', 'eee'];

  list.replaceRange(1, 3, ['BBB', 'CCC']); // インデックス番号「1~2」までの値を置換

  print(list); // [aaa, BBB, CCC, ddd, eee]
}

実行結果を見ると、インデックス番号「1~2」までの値が置換されていることが確認できます。

空のリストに「0~0」の範囲を設定すると、値をそのまま挿入できます。

void main() {
  var list = [];

  list.replaceRange(0, 0, ['BBB', 'CCC']);

  print(list); // [BBB, CCC]
}

範囲外の位置を指定するとエラー「RangeError」が発生します。

void main() {
  var list = ['aaa', 'bbb', 'ccc', 'ddd', 'eee'];

  list.replaceRange(1, 10, ['BBB', 'CCC']);

  print(list);
}

Unhandled exception:
RangeError (end): Invalid value: Not in inclusive range 1..5: 10
#0      RangeError.checkValidRange (dart:core/errors.dart:363:9)
#1      ListMixin.replaceRange (dart:collection/list.dart:446:16)
#2      main (file:///c:/sample/main.dart:4:8)
#3      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#4      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)

定数

「const」で宣言したリストを置換しようとすると、エラー「Unsupported operation: Cannot remove from an unmodifiable list」が発生します。

void main() {
  const list = ['aaa', 'bbb', 'ccc', 'ddd', 'eee'];

  list.replaceRange(1, 3, ['BBB', 'CCC']);

  print(list);
}

Unhandled exception:
Unsupported operation: Cannot remove from an unmodifiable list
#0      UnmodifiableListMixin.replaceRange (dart:_internal/list.dart:184:5)
#1      main (file:///c:/sample/main.dart:4:8)
#2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)    
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)

「final」の場合は、メモリ領域は変更できるためエラーにはなりません。

void main() {
  final list = ['aaa', 'bbb', 'ccc', 'ddd', 'eee'];

  list.replaceRange(1, 3, ['BBB', 'CCC']);

  print(list); // [aaa, BBB, CCC, ddd, eee]
}