我认为 - 稍微猜测一下updateDetails()
- 你应该将其签名更改为:
Results updateDetails(Results accumulatedResults, List<String> items);
适当地定义您自己的 Results 类并为其编写一个toString()
。updateDetails
根据之前的结果和新列表计算结果。例如,如果它应该计算字符串长度的总和:
Results updateDetails(Results accumulatedResults, List<String> items) {
int sum = accumulatedResults.getSum();
for(String item : items) {
sum += item.length();
}
return new Results(sum);
}
这意味着您不会重复可能昂贵的计算。
然后你的代码需要重复调用它:
Results results = new Results(); // start with an empty one
results = updateDetails(results,strings.subList(0,1));
System.out.println(results);
results = updateDetails(results,strings.subList(1,5));
System.out.println(results);
results = updateDetails(results,strings.subList(5,10));
System.out.println(results);
... 等等。请注意,我认为让函数返回一个可以打印的值要比让函数自己进行打印要好得多。它更可重用,更可测试。
当然,您可以循环执行此操作:
Results results = new Results(); // start with an empty one
int[] sizes = new int[] { 1, 5, 10, 25, 50, 100, 200, 1000 };
int last=0;
for(int i = 0; i<size.length; i++) {
int size = sizes[i];
results = updateDetails(results,strings.subList(last,size));
System.out.println(results);
last = size;
}
这就是基础。正如所写的那样,对于小于 1000 的输入列表,它将失败。我将把它作为练习留给你:
- 检查 size > strings.size() + 1
- 如果是这样,将大小调整为 strings.size() + 1 并使其成为循环的最后一次迭代
(+1 因为 List.subList() 的工作方式)
您还需要考虑超过 1000 的输入列表会发生什么。也许最好有一个sizeForIteration(int iteration)
方法来处理 的任意大值iteration
,而不是简单的数组查找。
一个更简单的算法是将“报告点”的知识放入您的 updateDetails 逻辑中。
for(int i=0; i<list.size; i++) {
// do something with list.get(i)
if( sizes.contains(i) {
System.out.println(something);
}
}
System.out.println(something);
我的主要答案虽然更复杂,但我认为更灵活。