2016-07-31 73 views
1

我一直在嘗試CodeBat上的新部分,map1 & 2.我已經完成map1,並且我在map2的一半,但我只是停留在這個問題上。我似乎無法弄清楚如何組合兩個字符串。在地圖中結合兩個不同的字符串

鑑於非空字符串數組,返回一個Map<String, String> 與看出對於每個不同的第一字符的鍵,用 所有字符串開始與該字符在它們出現在 順序附加到一起的值陣列。

例子:

firstChar(["salt", "tea", "soda", "toast"]) → {"t": "teatoast", "s": "saltsoda"} 
firstChar(["aa", "bb", "cc", "aAA", "cCC", "d"]) → {"d": "d", "b": "bb", "c": "cccCC", "a": "aaaAA"} 
firstChar([]) → {} 

這裏是我的代碼:

public Map<String, String> firstChar(String[] strings)      
{    
    Map<String, String> map = new HashMap<String, String>();  
    String x = "";   
    for (String s: strings)  
    { 
     if (s.substring(0,1) == s.substring(0,1)) 
     x += s; 
     map.put(s.substring(0,1), x);   
    }  
    return map; 
} 

我只得到{"d": "d", "b": "", "c": "", "a": ""}

我也試過s.substring(0, 1, map.get(s) + map.get(s))只返回null。如果任何人都可以向我解釋這將是不勝感激!

謝謝!

+1

什麼是你的條件呢?您將子字符串的結果與自身進行比較。 – mhoff

+0

可能重複的[我如何比較Java中的字符串?](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – azurefrog

+0

我現在無法測試這個,但是您想要執行以下操作:對於每個字符串計算'k = s.charAt(0)'。如果'k'已經在地圖中,請獲取它的值,並將其與's'連接並再次放入'k'。如果不是簡單地把's'換成'k'。 – mhoff

回答

3

你的邏輯錯了,你在比較字符串的第一個字符和它自己。另外,雖然這裏並不是你的問題,但你正在比較字符串==而不是equals==用於比較參考,equals用於比較邏輯相等。另外,爲了得到字符串的第一個字符,你可以使用s.charAt(0)。具有諷刺意味的是,如果你這樣做了,你就不會有這個問題,因爲String.charAt返回一個char,這是一個原始類型,因此可以使用==安全地進行比較。

代碼進行了各種改善和修正:

public Map<String, String> firstChar(String[] strings) {    
    Map<String, String> map = new HashMap<>();     
    for (String s: strings) { 
    map.merge(String.valueOf(s.charAt(0), s, String::concat); 
    }  
    return map; 
} 

或預先的Java 8:

public Map<String, String> firstChar(String[] strings) {    
    Map<String, String> map = new HashMap<>();     
    for (String s: strings) { 
    String key = String.valueOf(s.charAt(0)); 
    String value = map.get(key); 
    map.put(key, (value == null ? "" : value) + s);   
    }  
    return map; 
} 
+0

爲什麼你認爲'key = String.valueOf(s.charAt(0))'比'key = s.substring(0,1)'更好,這看起來要簡潔得多? – Andreas

+0

謝謝。 '方法getOrDefault(char,String)對於類型Map 是未定義的''是我得到的錯誤。我試着調整它,並且我沒有太多。對不起,必須像這樣spoon!! 我不得不做s.substring(0,1),我得到兩個字符串組合,但它仍然在它前面有空。 – Cat

+0

使用'substring'獲取第一個字符是很牽強的,並且可能會導致StringBuilder被分配的大小大於1,全部爲空。 – Dici

0
public Map<String, String> firstChar(String[] strings) { 
Map<String, String> map = new HashMap<String, String>(); 
    for (String s:strings) { 
    if (!map.containsKey(s.substring(0,1))) { // first time we've seen this string 
     map.put(s.substring(0,1), s); 

    } 
    else 
    { 
    String existing = map.get(s.substring(0,1)); 
     map.put(s.substring(0,1), existing+s); 
    } 

} 
    return map; 
} 
0
public Map<String, String> firstChar(String[] strings) { 
    Map<String, String> map = new HashMap<String, String>(strings.length); 
    for (String string : strings) { 
     String firstCharacter = String.valueOf(string.charAt(0)); 
     map.put(firstCharacter, map.getOrDefault(firstCharacter, "") + string); 
    } 
    return map; 
} 
0
public Map<String, String> firstChar(String[] strings) { 
    Map<String, String> str = new HashMap<String, String>(); 
    for (int i = 0; i < strings.length; i++) { 
     String value = ""; 
     for (int j = 0; j < strings.length; j++) { 
      if (strings[i].charAt(0) == strings[j].charAt(0)) { 
       value = value+strings[j]; 
      } 
     } 
     str.put(Character.toString(strings[i].charAt(0)), value); 
    } 
    return str; 
}