Ich habe Probleme, die folgenden zu arbeiten. Der Sinn dieser Aufgabe ist Ströme zu verwenden:Java, Collectors.toList() erstellt nur ein Element
Map<String, List<String>> descriptions = new HashMap<>();
wordArray[2] = "D1_E1^E2^E3^E4~D2_E1^E2";
if(wordArray[2].contains("~")) {
Arrays.stream(wordArray[2].split("~"))
.forEach(s -> descriptions.put(s.split("_")[0],
s.split("_")[1].contains("^")
? Arrays.stream(s.split("_")[1].split("^"))
.collect(Collectors.toList())
: Arrays.asList(s.split("_")[1])));
}
Aus irgendeinem Grund dieses Collectors.toList() erzeugt nur einen String "E1^E2^E3^E4"
statt separate Strings. Meine Vermutung ist, dass ich hier falsch liege: Arrays.stream(s.split("_")[1].split("^"))
, aber ich weiß nicht wo genau und wie es zu beheben ist. Mehr noch, weil das ganz gut funktioniert und dem obigen sehr ähnlich ist:
List<String> synonyms = new ArrayList<>();
wordArray[3] = "S1_S2_S3_S4";
synonyms = wordArray[3].contains("_")
? Arrays.stream(wordArray[3].split("_")).
collect(Collectors.toList())
: Arrays.asList(wordArray[3]);
Vielen Dank!
Der 'split()' Parameter ist ein regulärer Ausdruck, und '^' ist ein spezielles passendes Muster für den Anfang des Strings. Um auf '^' zu teilen, entkomme es, d. H. 'Split (" \\^")'. Wenn jedoch 'split()' mit etwas aufgerufen wird, das nicht in der Eingabe existiert, d.h. wenn 'contains()' return false ist, wird nur ein Ein-Element-Array mit der gesamten Eingabe zurückgegeben. Der 'contains()' Aufruf ist Zeitverschwendung. – Andreas
Was ist Ihre erwartete Ausgabe? – developer
@Andreas, danke, das war das Problem! Es funktioniert auch ohne den Aufruf 'contains()', also danke auch für diesen Tipp. –