2016-03-24 4 views
-1

Mit diesem Code entspricht:Ersetzen Sie Zeichenfolge, die Schlüssel in der Karte unter Verwendung von Lambda

import java.util.Arrays; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.List; 
import java.util.stream.Collectors; 

public class Replace 
{ 

    public static void main(String args[]){ 
     Map<String , String> map = new HashMap<String , String>(); 
     map.put("eleven", "11"); 

     String str = "replace the 11"; 

     List<String> ls = Arrays.asList(str.split(" ")); 

     ls.stream().map(m -> map.entrySet().forEach(e -> m.replaceAll(m , e.getKey()))); 
    } 

} 

Ich bin versucht zu ersetzen Vorkommen von „11“ in der String str mit „elf“. Also sollte str in "replace the eleven" umgewandelt werden.

Aber Ich erhalte Compilerfehler:

Multiple markers at this line 
    - Type mismatch: cannot convert from Stream<Object> to 
    <unknown> 
    - Cannot return a void result 

Wie Vorkommen von Schlüsseln in der Karte ersetzen, die String-Werte überein?

+1

Das sieht so aus das beantwortet Ihre Frage http://stackoverflow.com/q/36172502/1743880 – Tunaki

+0

@Tunaki das ist möglich, wie ich gerade in Update geschrieben habe? –

Antwort

1

Ihre Karte ist hinten nach vorne - Schlüssel sollten die Ziffern sein:

Map<String , String> map = new HashMap<String , String>(); 
map.put("11", "eleven"); // etc 

Dann ist es ein Motto:

str = Arrays.stream(str.split(" ")) 
    .map(s -> map.getOrDefault(s, s)) 
    .collect(Collectors.joining(" ")); 

Da dieser Code auf dem geteilten genau 1 Raum verbraucht und setzt zurück Genau ein Leerzeichen auf dem Join, variable Anzahl von Leerzeichen zwischen Wörtern werden beibehalten.

Hier einige Test-Code zu zeigen, dass:

Map<String , String> map = new HashMap<>(); 
map.put("11", "eleven"); // etc 
String str = "one two three 11 foo"; 

str = Arrays.stream(str.split(" ")) 
    .map(s -> map.getOrDefault(s, s)) 
    .collect(Collectors.joining(" ")); 

System.out.println(str); 

Ausgang:

one two three eleven foo 

dieser Code Siehe Live here ausgeführt wird.

+0

Wenn die Strings Leerzeichen mit variabler Länge enthalten, kann dies berücksichtigt werden? Verwenden von str.split ("(? <=;) | (? =;)"? Aber wie wird die Menge an Speicherplatz beim erneuten Verbinden berücksichtigt? –

+0

@ blue-sky Sie können nicht dann. Nicht so. Siehe die verknüpfte Frage, wo die Idee nicht ist, um die Räume zu teilen, sondern über die Ersetzungen zu iterieren und 'replaceAll' zu nennen – Tunaki

+0

@blue dies funktioniert bereits mit variablen Räumen Genau 1 Raum wird von der Teilung verbraucht, und genau 1 Platz wird zurückgelegt Wenn mehrere Leerzeichen angetroffen werden, ist das "Wort", das vom Stream verarbeitet wird, eine leere Zeichenfolge (0) – Bohemian

Verwandte Themen