3

好的,伙计们,我试过这个:

List<num> test
for(num i = ...){
   test[i]...
   (...)
    for(num j = ...){
      test[i][j] = ...
    }
}

今天,但似乎没有工作。我的问题是......有没有办法在 Dart 中做到这一点?:)

4

3 回答 3

7

这是一种方法:

main() {
  List<List<int>> matrix = new List<List<int>>();
  for (var i = 0; i < 10; i++) {
    List<int> list = new List<int>();

    for (var j = 0; j < 10; j++) {
      list.add(j);
    }

    matrix.add(list);
  }

  print(matrix);
  print(matrix[2][4]);
}

如果您提前知道长度,并且它不会改变,您可以将长度传递给构造函数:

main() {
  int size = 10;
  List<List<int>> matrix = new List<List<int>>(size);
  for (var i = 0; i < size; i++) {
    List<int> list = new List<int>(size);

    for (var j = 0; j < size; j++) {
      list[j] = j;
    }

    matrix[i] = list;
  }

  print(matrix);
  print(matrix[2][4]);
}

注意主要区别。在第一个示例中,列表创建为空,因此循环需要显式地将元素添加到列表中。在第二个示例中,列表以固定大小创建,每个索引处都有空元素。

变更日志:第二个示例的原始版本使用了List.fixedLength(size)Dart 1.0 之前存在的构造函数。

于 2013-02-23T04:16:59.940 回答
3

在每个位置构造具有不同值的列表的一种方法是使用成语 new Iterable.generate(size, function).toList()

makeMatrix(rows, cols) =>
    new Iterable<List<num>>.generate(
        rows,
        (i) => new List<num>.fixedLength(cols, fill: 0)
      ).toList();

main() {
  print(makeMatrix(3, 5));
}

印刷: [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

fill:要获取参数,您必须构造一个固定长度的列表,这有点烦人。如果没有填充值,内部列表将包含nulls。获得具有初始值的可扩展列表的一种方法是创建一个空列表并对其进行扩展。

(i) => <num>[]..insertRange(0, cols, 0)

a..b()..c()这是在返回它调用a.b()a.c()返回之前使用方法级联来修改列表a。这很方便,因为它避免了对临时变量的需要。请注意,由于某种原因,insertRange它具有位置参数而不是命名fill参数。

如果您想对内容进行更多控制,可以将生成到列表的想法扩展到两个级别:

makeMatrix(rows, cols, function) =>
    new Iterable<List<num>>.generate(
        rows,
        (i) => new Iterable<num>.generate(cols, (j) => function(i, j)).toList()
      ).toList();

main() {
  print(makeMatrix(3,5, (i, j) => i == j ? 1 : 0));
}

印刷:[[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0]]

于 2013-02-23T05:02:57.343 回答
1

pub上有一些用于处理矩阵的优秀库(例如 Kevin Moore 的 BOT),但是如果您要快速寻找一些东西,您可以这样做:

List<List> test = new List<List>(n);
for (var i = 0; i < n; i++) {
  test[i] = new List(n);
}

for (var i = 0; i < n; i++) {
  for (var j = 0; j < n; j++) {
    test[i][j] = myValue;
  }
}
于 2013-02-23T04:17:57.733 回答