2017-01-15 7 views
-1

A→B、C→D、B→C、D→Eのようなシーケンスがあるとします。 リンクリストを構築する必要があります。 出力:A-> B-> C-> D-> E壊れたsequneceからリンクリストを構築する

2つのシナリオがあります。最初のケースでは、すべてのシーケンスがあります。 2番目のケースでは、シーケンスデータがストリームとして入力されています。

この問題を解決する方法については、ヘルプが必要です。

私はそうのように、私はちょうど、地図にデータを格納すると思い
+2

質問はあまり明確ではありません。これらの番号付きのパケットか何か?ストリームはどのように見えますか? – john16384

+0

入力は文字列のリスト、 "A-> B"、 "C-> D"などです。リストのすべての要素が最初にある場合、それらからリンクリストを作成する必要があります。 2番目のシナリオでは、リストはストリームとして来ていますが、最初はリスト内のすべての要素を持っていないので、ストリームから次の文字列を取得するときに、 – bbshaw

答えて

0

A: B 
B: C 
C: D 
D: E 

、潜在的に第二の独立したチェーン:

Map<String, String> sequences = new HashMap<>(); 
String input = "A->B"; 
String[] parts = input.split("->"); // Split input in two parts 

sequences.put(parts[0], parts[1]); 

このマップは、最終的に次のようになります

G: F 
H: G 

ここで、各チェーンの開始位置を見つける必要があります。このマップでは、一度も値として使用されていないキーを探すことでチェーンの開始点を見つけることができます。

これは実行して行うことができます。今すぐ

// make a copy of all keys 
Set<String> chainStarters = new HashSet<>(sequences.keySet()); 

// remove all keys that are also used as a value 
chainStarters.removeAll(sequences.values()); 

chainStartersは、各鎖の開始が含まれています。上記の場合、それはAHになります。

ここで残されているのは、のキーから始まるsequencesマップの各値を順番に調べて、それからストリングを作成することです。次のようなものがあります。

String currentKey = startKey; // 'A' for example 
StringBuilder sb = new StringBuider(startKey); 

while(sequences.containsKey(currentKey)) { 
    currentKey = sequences.get(currentKey); 

    sb.append("->").append(currentKey); 
} 

System.out.println(sb.toString()); 
関連する問題