Dart语言:创建和访问动态列表

时间:2014-08-07 12:38:03

标签: list arraylist dart

我在动态创建列表时遇到了一些麻烦。

例如,当我们以这种方式创建List时......

List testList = [["John", 100], ["Maria", 200]]; // Some Strings and integers.

(或)

testList.add(["John", 100]);
testList.add(["Maria", 200]);

...我们可以通过(使用打印)...

访问列表的信息和条目
testList.length; // That returns: 2
testList; // That returns: [[John, 100], [Maria, 200]]
testList[0]; // That returns: [John, 100]
testList[1]; // That returns: [Maria, 200]

到目前为止,没什么新东西(至少对我来说)。但是有一些有趣的东西我无法通过一些动态代码重现(我稍后会再解释)。

如果您尝试将该List作为某种多维List / Array访问,它将起作用。我没想到这一点,因为我读了很多教程,说Dart本身无法处理这种列表/数组。让我们再看看打印......

testList[0]; // Again, that returns: [John, 100]
testList[1]; // Again, that returns: [Maria, 200]
testList[0][0]; // That returns: John
testList[0][1]; // That returns: 100
testList[1][0]; // That returns: Maria
testList[1][1]; // That returns: 200

实际上这真的很好,但现在我在尝试动态创建这些多维列表时遇到了问题。

我想通过从另一个List获取一些数据来创建一个动态对象List(就像这样工作" testList"我已经解释过了)。如果我知道要添加到新列表的确切信息数量,我会这样做:

newDynamicList.add([dataSourceList[0], dataSourceList[1]);

然而,这不是我的意图。我想构建一个可以动态执行的方法。换句话说,从数据源列表中获取多少参数,并根据相应的"行"添加它们。 ([0] [0],[0] [1],[0] [2],...)。

我试图这样做:

// Where:
// dataList is the data source. Each line has an object.
// numberOfFields reflects how wide the new data List will get.
// iteration is a local variable that is compared to numberOfFields in order to
//           let the code know when to finish that List's line and start a new one.
List getDataParameters(List dataList, int numberOfFields) {
    List tempDataList = new List(); // This list will store the objects in order to build the dataParametersList.
    List dataParametersList = new List(); // This list will be returned to the caller.
    if (dataList.length != 0 && numberOfFields != 0) { // Check for null.
        if (numberOfFields == 1) { // Just one field, do this.
            for (int loop = 0; loop < dataList.length; loop++) {
                dataParametersList.add(dataList[loop]);
            }
        } else { // More than one field.
            int iteration = 1;
            for (int loop = 0; loop < dataList.length; loop++) {
                if (iteration < numberOfFields) {
                    tempDataList.add(dataList[loop]);
                    iteration++;
                } else {
                    tempDataList.add(dataList[loop]);
                    dataParametersList.add(tempDataList); // >>> HERE LIES THE PROBLEM. <<<
                    iteration = 1;
                }
            }
        }
    } else {
        // If there's no data, how to throw exception here?
    }
    return dataParametersList;
}

我假设&#34; dataParametersList.add(tempDataList);&#34;会将tempDataList中的对象添加到dataParametersList,就像我手动执行一样。但它只是不起作用。

所以问题是:如何创建这些动态对象列表能够像第一个示例中那样使用它们?

我很抱歉这个问题很长,但我尽量保持清醒。

编辑1:我忘了说我知道我提供的代码是错误的原因之一(可能更多):它在每次迭代时将tempDataList的所有信息添加到dataParametersList,因为我不是清除tempDataList(并清除它只会使事情变得更糟,因为后一个列表变为空)。

编辑2:

getDaraParameters(List dataList,int numberOfFields)用法示例:

List dtLst = new List();
dtLst.add("John");
dtLst.add(100);
dtLst.add("Maria");
dtLst.add(200);
print(dtLst); // Returns: [John, 100, Maria, 200]

我考虑使用两个字段,因此上面的4行列表在传递给getDataParameters(dtLst,2)之后应该如下所示(假设打印其结果):

[[John, 100], [Maria, 200]]

但我需要它像问题的第一个例子一样工作,多维坐标可以工作。

1 个答案:

答案 0 :(得分:2)

它还没有答案,但无论如何:

而不是

for (int loop = 0; loop < dataList.length; loop++) {
  dataParametersList.add(dataList[loop]);
}
你可以写

dataParametersList.addAll(dataList);

更新

这应该这样做。

import 'dart:math' as math;

void main() {
  print(getDataParameters([], 2));
  print(getDataParameters(["John"], 2));
  print(getDataParameters(["John", 100, "Maria"], 2));
  print(getDataParameters(["John", 100, "Maria", 200], 2));
  print(getDataParameters(["John", 100, "Maria", 200, 10], 2));
}

List getDataParameters(List dataList, int numberOfFields) {
  var result = [];
  int i = 0;
  while(dataList.length > i) {
    result.add(dataList.sublist(i, math.min(i + numberOfFields, dataList.length)));
    i += numberOfFields;
  }
  return result;
}

输出

[]
[[John]]
[[John, 100], [Maria]]
[[John, 100], [Maria, 200]]
[[John, 100], [Maria, 200], [10]]

sublist会创建一个包含dataList[i]dataList[i + numberOfFields]项的列表 此列表已添加到resultmath.min(i + numberOfFields, dataList.length)确保在dataList结尾处仅请求剩余的项目数量(dataList.lengthnumberOfFields时没有余数。<登记/> (当dataList有5个项sublist(4,6)会抛出异常时)

较短的版本

List getDataParameters(List l, int f) {
  return new List.generate((l.length / f).ceil(), 
    (i) => l.sublist(i * f, math.min(i * f + f, l.length)));
}