【发布时间】:2016-05-11 09:27:00
【问题描述】:
我需要一些代码示例或算法来调整 List<List<Integer>> 的大小,这应该可以在下一个方式中使用:
假设我们有下一个newSize 和incomingList(伪代码):
int newSize = 4;
List<List<Integer>> incomingList = List(List(1,2,3),List(4,5,6),List(7,8,9);
List<List<Integer>> result = resizeListOfNestedList(newSize, incomingList)
newSize 整数设置incomingList 的新大小,resizeListOfNestedList 应该返回非奇数的下一个结果(例如 4):
List(List(1,2),List(3,4),List(5,6),List(7,8)
如果 newSize 是奇数(例如 3),则下一步:
List(List(1,2),List(3,4,5),List(6,7,8)
newSize 总是大于incomingList.size()
如果有任何建议,我将不胜感激。
更新
在google.common.Lists 的帮助下,我已经完成了代码草稿(是的,它闻起来很香),我希望它对某人有所帮助。
在我的情况下,方法接收不同的incomingList.size()s 和newSize 参数,很明显incomingList.size()/newSize 将返回双精度值(例如传入 list.size() = 1000,但我们需要将其“压缩”到 600元素)所以我不能一直使用Lists.partition。 expandList 最好在下一个代码之后调用:
int maxSplitValue = (int) Math.ceil((double) incomingList.size() / newSize);
List<List<Integer>> firstPortionValues = Lists.partition(
incomingList, maxSplitValue
);//size can be less than required after double to int upper round
if (firstPortionValues.size() < maxSplitValue) {
List<List<Integer>> expandedList = expandList(firstPortionValues, maxSplitValue)
}
结果:
Incoming list:[[0, 1], [2, 3]]
New size value: 3
Outcoming list:[[0], [1], [2, 3]]
Incoming list:[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]
New size value: 4
Outcoming list:[[0.0], [1.0], [2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]
代码:
public List<List<Integer>> expandList(List<List<Integer>> incomingList, int newSize) {
List<List<Integer>> resultList = new ArrayList<>();
for (int index = 0; index < incomingList.size(); index++) {
List<Integer> nodeList = incomingList.get(index);
final int minPortionValue = getMinPortionValue(
incomingList.size(), resultList.size(), nodeList.size(), index, newSize
);
List<List<Integer>> portionResult = splitNodeList(new ArrayList<>(nodeList), minPortionValue);
resultList.addAll(portionResult);
}
return resultList;
}
private int getMinPortionValue(int listSize, int resultListSize, int listElementSize, int index, int newSize) {
if (listElementSize > 1) {
int maxPortionValue = listElementSize % 2 == 0 ? listElementSize / 2 : --listElementSize;
boolean isOkUseMaxPortionValue = maxPortionValue + listSize - index + resultListSize <= newSize;
if (isOkUseMaxPortionValue) {
return maxPortionValue;
} else {
return getMinPortionValue(listSize, resultListSize, listElementSize - 1, index, newSize);
}
} else {
return 0;
}
}
private List<List<Integer>> splitNodeList(List<Integer> nodeList, int minSplitValue) {
List<List<Integer>> result = new ArrayList<>();
if (minSplitValue > 0) {
result.addAll(Lists.partition(nodeList, minSplitValue));
return result;
} else {
result.add(nodeList);
return result;
}
}
【问题讨论】:
-
请向我们展示您到目前为止所做的尝试。
-
@eltabo 如果我有一些有用的代码草案,我会带着问题发布它。请注意,我没有要求完整的解决方案。另外,我想应该有一些 java 库可以提供帮助。
-
任务不够清晰,例子中你不是丢了9的值吗?
-
当您谈论处理列表列表时......这基本上是tree,您可能希望相应地实现您的数据结构。它可以为您节省很多头痛。然后这变成了一个更常见的树遍历/重新平衡问题。
-
@unpc 你应该发布一个答案并将你的问题标记为已解决
标签: java nested-lists