我在动态创建列表时遇到了一些麻烦。
例如,当我们以这种方式创建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]]
但我需要它像问题的第一个例子一样工作,多维坐标可以工作。
答案 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]
项的列表
此列表已添加到result
。
math.min(i + numberOfFields, dataList.length)
确保在dataList
结尾处仅请求剩余的项目数量(dataList.length
除numberOfFields
时没有余数。<登记/>
(当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)));
}