2017-01-15 2 views
-1

Angenommen, wir haben einige Sequenz wie A-> B, C-> D, B-> C, D-> E Wir müssen eine verkettete Liste daraus erstellen. Ausgang: A-> B-> C-> D-> EErstellen Sie eine verkettete Liste von zerbrochenen sequcece

Es kann zwei Szenarien geben. Erster Fall, wir haben alle Sequenzen. Im zweiten Fall kommen Sequenzdaten als Stream herein.

Benötigen Sie Hilfe bei der Lösung dieses Problems.

+2

Die Frage ist nicht sehr klar. Sind das nummerierte Pakete oder so? Wie würde ein Strom aussehen? – john16384

+0

Eingabe ist eine Liste von Strings, "A-> B", "C-> D" usw. Im ersten Fall habe ich alle Elemente in der Liste, ich muss eine verkettete Liste von ihnen erstellen. Im zweiten Szenario kommt die Liste als Stream, ich habe zunächst nicht alle Elemente in der Liste, ich muss weiterhin die verknüpfte Liste konstruieren, und wenn ich die nächste Zeichenfolge aus dem Stream bekomme – bbshaw

Antwort

0

Ich glaube, ich würde die Daten nur speichern, in einer Karte, etwa so:

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]); 

Diese Karte wird schließlich wie folgt aussehen:

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

und möglicherweise eine zweite unabhängige Kette:

G: F 
H: G 

Jetzt müssen wir finden, wo jede Kette beginnt. Ein Kettenstart kann in dieser Map gefunden werden, indem nach Schlüsseln gesucht wird, die niemals als Wert verwendet werden.

Dies kann tun getan werden:

// 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()); 

Jetzt jeder Kette chainStarters enthält den Start. In dem oben beschriebenen Fall wäre das A und H.

Jetzt müssen Sie nur noch jeden Wert in der sequences Karte nachsehen, beginnend mit den Schlüsseln in chainStarters und einen String daraus machen. Etwas wie:

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());