在飞镖中制作矩阵

问题描述 投票:2回答:3

好的,我试过这个:

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

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

dart
3个回答
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元素。

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


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参数。

如果您想要更多地控制内容,可以将generate-to-list创意扩展到两个级别:

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


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;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.