我有一个List of Lists结构和一个名为 tree 的递归函数。在下面的代码中,它永远不会到达current == null
语句,因此它将永远运行。
如果我不能使用null
,解决方案是什么?
private void tree(LinkedList<LinkedList<String>> partitions, LinkedList<String> part)
{
LinkedList<String> current = findBiggerPartitionContained(partitions, part);
if (current == null) {
return;
}
tree(partitions, current);
}
private LinkedList<String> findBiggerPartitionContained(LinkedList<LinkedList<String>> partitions, LinkedList<String> part)
{
LinkedList<String> max = new LinkedList<>();
boolean flag = false;
for (LinkedList<String> item : partitions) {
if (item.size() > max.size() && part.containsAll(max)) {
max = item;
flag = true;
}
}
if (!flag)
return null;
flag = false;
return max;
}
答案 0 :(得分:1)
大部分时间flag
都是true
,因为您的条件测试item.size() > max.size()
,而max
初始化为空列表。当max
为空时,表达式part.containsAll(max)
也将为true
,这会导致意外结果。
要解决此问题,您可以在findBiggerPartitionContained
:
if (item.size() > max.size() && item.containsAll(part)) {
max = item;
flag = true;
}
这是tree
:
if (current.equals(part)) {
return;
} else {
tree(partitions, current);
}
如果我理解正确,您正在寻找partitions
中包含part
的最大列表。也许以下内容不易出错且更具可读性:
List<String> result = partitions.stream().filter(list -> list.containsAll(part))
.max(Comparator.comparingInt(List::size))
.orElse(null);
您可以使用此Johan Kool:
进行测试List<String> p0 = new LinkedList<>(Arrays.asList("a", "b", "c"));
List<String> p1 = new LinkedList<>(Arrays.asList("a", "b"));
List<String> p2 = new LinkedList<>(Arrays.asList("a", "b", "c", "d"));
List<String> p3 = new LinkedList<>(Arrays.asList("a", "b", "e", "d"));
List<List<String>> partitions = Arrays.asList(p0, p1, p2, p3);
List<String> part = new LinkedList<>(Arrays.asList("a", "b", "e"));
List<String> result = partitions.stream().filter(list -> list.containsAll(part))
.max(Comparator.comparingInt(List::size))
.orElse(null);
System.out.println(result);
请注意,这可能会返回null
来处理缺席的MCVE。