在飞镖中制作矩阵

时间:2013-02-23 03:15:33

标签: dart

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

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

今天但似乎没有奏效。我的问题是......有没有办法在Dart中制作这个? :)

3 个答案:

答案 0 :(得分:4)

这是一种方法:

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]);
}

注意主要区别。在第一个示例中,列表是空的,因此循环需要显式地向列表中添加元素。在第二个示例中,列表是使用固定大小创建的,每个索引都包含null元素。

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

答案 1 :(得分: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:参数需要构建固定长度列表,这有点令人讨厌。如果没有填充值,内部列表将包含null s。获取具有初始值的可扩展列表的一种方法是创建一个空列表并进行扩展。

(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]]

答案 2 :(得分: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;
  }
}