2016-10-18 4 views
0

私はリストのリスト構造とというツリーの再帰関数treeを持っています。次のコードでは、決してcurrent == nullステートメントに達しないため、永遠に実行されます。LinkedListと再帰ループ問題のリンクされたリスト

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; 
} 
+1

あなたのコードで判断すると、 'current == null'ではなく' current.isEmpty() 'でなければなりません。 – Zircon

+0

私はちょうどisEmptyで試しましたが、何も変わりませんでした。 – user840718

+0

デバッガの細かいケース –

答えて

1

あなたの条件がitem.size() > max.size()をテストし、maxは空のリストで初期化されるので、時間flagの大半は、trueになります。 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); 
} 

partを含むpartitionsにあります。たぶん次は発生しやすいと読みやすく少ないエラーです:

List<String> result = partitions.stream().filter(list -> list.containsAll(part)) 
             .max(Comparator.comparingInt(List::size)) 
             .orElse(null); 

あなたはこのMCVEでそれをテストすることができます。

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不在Optional Sを処理すること。

関連する問題