2016-03-24 35 views
-1

kullanarak haritadaki anahtarları eşleşen dizeleri Değiştir: Ben "onbir" ile dize str "11" tekrarlarını değiştirmek çalışılıyorbu kodu kullanarak 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()))); 
    } 

} 

. Yani str "onbirin yerine" dönüştürülmelidir.

Ama alıyorum derleyici hatası:

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

Nasıl dize değerleri eşleşen haritası tuşların tekrarlarını değiştirmek için?

+1

Bu, http://stackoverflow.com/q/36172502/1743880 – Tunaki

+0

@Tunaki sorusuna benzer bu soruna benziyor. –

cevap

1

bilgi haritada arkadan öne etmektir - tuşları basamaklı olmalıdır: Bu kod split üzerine tam olarak 1 boşluk tüketir ve geri koyar Çünkü

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

:

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

Sonra bir astar var Birleştireki tam olarak bir boşluk, kelimeler arasındaki boşlukların sayısı korunur.

İşte göstermek için bazı test kodu olduğunu:

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

Çıktı:

one two three eleven foo 

bu kod canlı here çalışan Bkz.

+0

Dizeler değişken uzunluktaki boşluklar içeriyorsa bu yerleştirilebilir mi? Str.split kullanarak ("(? <=;) | (? =;)"? Ama yeniden katılırken boşluk miktarını nasıl ekleyebiliriz? –

+0

@ mavi gökyüzü Bu durumda olamazsınız. fikrin, boşluklar etrafında bölmek değil, değiştirmeler üzerinde yinelemek ve 'replaceAll 'i çağırmak için bağlantılı soru. – Tunaki

+0

@blue, bu zaten değişken boşluklarla çalışır. Tam olarak 1 alan bölünerek tüketilir ve tam olarak 1 boşluk geri alınır Birden fazla boşlukla karşılaşıldığında, akış tarafından işlenen "sözcük" boş (sıfır uzunluk) bir dize olacaktır. – Bohemian