Java 在映射中组合两个不同的字符串

Java 在映射中组合两个不同的字符串,java,dictionary,hashmap,Java,Dictionary,Hashmap,我一直在尝试关于编码蝙蝠、地图1和2的新部分。我已经完成了map1,我已经完成了map2的一半,但我只是被困在这个问题上。我似乎不知道如何组合两个字符串 给定一个非空字符串数组,返回一个Map 每个不同的第一个字符都有一个键,值为 以该字符开头的所有字符串在 它们在数组中出现的顺序 示例: firstChar(["salt", "tea", "soda", "toast"]) → {"t": "teatoast", "s": "saltsoda"} firstChar(["aa", "bb",

我一直在尝试关于编码蝙蝠、地图1和2的新部分。我已经完成了map1,我已经完成了map2的一半,但我只是被困在这个问题上。我似乎不知道如何组合两个字符串

给定一个非空字符串数组,返回一个
Map
每个不同的第一个字符都有一个键,值为 以该字符开头的所有字符串在 它们在数组中出现的顺序

示例:

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;   
}
publicmap firstChar(String[]strings)
{             
Map Map=newhashmap();
字符串x=“”;
用于(字符串s:字符串)
{
如果(s.子串(0,1)==s.子串(0,1))
x+=s;
map.put(s.substring(0,1),x);
}     
返回图;
}
我只得到
{“d”:“d”,“b”:“c”:“a”:“}

我还尝试了
s.substring(0,1,map.get(s)+map.get(s))
,它只返回
null
。如果有人能向我解释这一点,我将不胜感激


谢谢大家!

您的逻辑错误,您正在将字符串的第一个字符与自身进行比较。此外,虽然这里的问题并不直接,但您将字符串与
=
进行比较,而不是与
进行比较
=
用于比较引用,
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;   
}
publicmap firstChar(String[]strings){
Map Map=newhashmap();
用于(字符串s:字符串){
map.merge(String.valueOf(s.charAt(0),s,String::concat);
}     
返回图;
}
或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;   
}
publicmap firstChar(String[]strings){
Map Map=newhashmap();
用于(字符串s:字符串){
String key=String.valueOf(s.charAt(0));
字符串值=map.get(键);
map.put(key,(value==null?“:value)+s);
}     
返回图;
}
公共地图firstChar(字符串[]字符串){
Map Map=newhashmap();
用于(字符串s:字符串){
if(!map.containsKey(s.substring(0,1)){//我们第一次看到这个字符串
map.put(s.substring(0,1),s);
}
其他的
{
字符串existing=map.get(s.substring(0,1));
map.put(s.substring(0,1),现有+s);
}
}
返回图;
}
公共地图firstChar(字符串[]字符串){
Map Map=newhashmap(strings.length);
for(字符串:字符串){
String firstCharacter=String.valueOf(String.charAt(0));
map.put(firstCharacter,map.getOrDefault(firstCharacter,“”)+string);
}
返回图;
}
公共地图firstChar(字符串[]字符串){
Map str=newhashmap();
for(int i=0;i
您的条件是什么?您将子字符串的结果与自身进行比较。我现在无法测试可能的重复项,但您希望执行以下操作:对于每个字符串计算
k=s.charAt(0)<代码> >如果代码<>代码>已经在映射中,得到它的值,将它与<代码> s>代码>连接起来,并再次为<代码> k>代码>。如果不是简单地将<代码> s <代码> > <代码> k>代码>。为什么要考虑<代码>键=字符串?值(S.CARAT(0))< /代码>优于<代码>密钥= S-子串(0, 1)
,这似乎更简洁和切中要害?谢谢。
类型映射的getOrDefault(char,String)方法未定义
是我遇到的一个错误。我尝试过使用它进行调整,但没有走多远。很抱歉,不得不这样使用勺子!我必须执行s.substring(0,1),我正在合并两个字符串,但前面仍然有null。使用
substring
获取第一个字符是牵强的,可能会导致
StringBuilder
被分配一个大于1的大小,全部无效。@Cat
getOrDefault()
是在Java 8中添加的。谢谢,我很感激!我不确定Java codingbat现在是什么版本。
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;
}
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;
}
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;
}