【问题标题】:Get the first character of each word in a String获取字符串中每个单词的第一个字符
【发布时间】:2020-11-01 17:10:08
【问题描述】:

我正在尝试让一个程序运行,它执行以下操作:

假设我们有一个名为nameString,设置为"Stack Overflow Exchange"。我想将每个单词的第一个字符输出给用户"SOE"。我尝试了split() 方法,但没有成功。

我的代码:

public class q4 {
    public static void main(String args[]) {
        String x = "michele jones";
        String[] myName = x.split("");
        for(int i = 0; i < myName.length; i++) {
            if(myName[i] == "") {
                String s = myName[i];
                System.out.println(s);
            }              
        }         
    }     
}   

我正在尝试检测是否有任何空格,然后我可以简单地获取下一个索引。谁能告诉我我做错了什么?

【问题讨论】:

  • 我知道这不是你的问题,但myName[i] == "" 在两个方面不好。 1.) 您使用== 来比较Strings,这是错误的。 2.) 不要将String"" 进行比较,而是使用StringisEmpty() 方法。

标签: java string


【解决方案1】:
String initials = "";
for (String s : fullname.split(" ")) {
  initials+=s.charAt(0);
}
System.out.println(initials);

这样工作:

  1. 声明一个变量“initials”来保存结果
  2. 在空格上拆分全名字符串,并在单个单词上进行迭代
  3. 将每个单词的第一个字符添加到首字母

编辑:

正如建议的那样,字符串连接通常效率不高,如果您正在处理非常长的字符串,StringBuilder 是一个更好的选择:

StringBuilder initials = new StringBuilder();
for (String s : fullname.split(" ")) {
  initials.append(s.charAt(0));
}
System.out.println(initials.toString());

编辑:

你可以简单地获得一个字符串作为一个字符数组:

char[] characters = initials.toString().toCharArray();

【讨论】:

  • 我会使用 StringBuilder,因为如果要“解析”的字符串很大,您的代码在内存方面的效率会很低
  • For statements 没有大括号是邪恶的。请添加大括号。
  • 谢谢老兄,如果我想将每个首字母存储在数组中怎么样,
【解决方案2】:

尝试按" "(空格)拆分,然后获取每个单词的charAt(0)(第一个字符)并像这样打印:

public static void main(String args[]) {
    String x = "Shojibur rahman";
    String[] myName = x.split(" ");
    for (int i = 0; i < myName.length; i++) {
        String s = myName[i];
        System.out.println(s.charAt(0));
    }
}

【讨论】:

    【解决方案3】:

    使用 Java 8 流:

    String initials = Arrays.stream(str.split(" "))
        .map(s -> s.substring(0, 1))
        .collect(Collectors.joining());
    System.out.println(initials);
    

    【讨论】:

      【解决方案4】:

      如果你使用的是 kotlin,那么你可以使用下面的代码来获取初始字符​​p>

       val myName = name.split(" ")
       val initial = myName.fold("", { acc, s -> acc + s[0] })
       print(initial)
      

      【讨论】:

        【解决方案5】:

        您的代码中有许多错误:

        String [] myName=x.split("");
        

        您真的要在""(空字符串)上拆分吗?您可能想在空格上拆分:

        String [] myName=x.split(" ");
        

        还有:

        if(myName[i]=="")
        

        永远不要在 Java 中将字符串与 == 进行比较,始终使用 .equals

        if (myName[i].equals(""))
        

        【讨论】:

          【解决方案6】:

          很惊讶没有人提到使用已经可用的库。可以在这里使用WordUtils form apache commons-text

          String name = "My Name";
          String initials = WordUtils.initials(name);
          System.out.println(initials);  // Outputs:  MN
          

          【讨论】:

            【解决方案7】:

            您正在拆分一个空字符串而不是空格“”。您的循环也没有多大意义,我不确定您要做什么。

               String [] myName=x.split(" ");
               for(int i=0; i<myName.length; i++)
               {
                   if (!myName[i].isEmpty()) {
                      System.out.println(myName[i].charAt(0));
                   }              
               }          
            

            【讨论】:

              【解决方案8】:

              你需要用一个不能用“”分割的空格来溢出它。这并不意味着什么。 您做错的另一件事是 === 在字符串比较中不正确。请参考How do I compare strings in Java?

              public class q4 {
                 public static void main(String args[])
                 {
                     String x="Shojibur rahman";
                     String [] myName=x.split(" ");
                     for(int i=0; i<myName.length; i++)
                     {
                         if(!myName[i].equals(""))
                         {
                             System.out.println(myName[i]);
                         }               
                     }          
                 }     
              }
              

              【讨论】:

                【解决方案9】:

                由于您的程序没有线程安全,您可以使用StringBuilder。 对于长字符串,我建议您可以使用StringTokenizer

                【讨论】:

                • 1.) 不回答问题 2.) 永远不要使用 StringBuffer,除非你有一个 非常 好的理由 3.) 正如 @987654321 中所说@,不鼓励在代码中使用它。
                • 对不起,应该是StringBuilder。谢谢告知,我没有仔细阅读StringTokenizer Api。
                【解决方案10】:

                Java 8 中接受的回复:

                /**
                 * Gets the first character of every word in the sentence.
                 *
                 * @param string
                 * @return
                 */
                public static String getFirstLetterFromEachWordInSentence(final String string) {
                    if (string == null) {
                        return null;
                    }
                    StringBuilder sb = new StringBuilder();
                    Arrays.asList(string.split(" ")).forEach(s -> sb.append(s.charAt(0)).append(" "));
                    return sb.toString().trim();
                }
                

                【讨论】:

                  【解决方案11】:

                  上面写的拆分方法工作正常,但会在以下情况下报错:

                  1. 字符串以空格开头的第一个单词
                  2. 而且,如果字符串的单词之间有多个空格

                  当您从用户那里获取价值时,可能会出现上述情况, 在这种情况下,您可以使用:-

                      String SubName = "input text provided by user"
                      String initialsOfSubName = "";
                      boolean v = true;
                      for (int i = 0; i < SubName.length(); i++) {
                          // If it is space, set v as true.
                          if (SubName.charAt(i) == ' ')
                              v = true;
                          else if (SubName.charAt(i) != ' ' && v == true) {
                              initialsOfSubName += (SubName.charAt(i));
                              // on the place of string you can store it in an, array or list;
                              v = false;
                          }
                      }
                      Log.d("testRegex",initialsOfSubName);
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-09-04
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-06-10
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-08-24
                    • 2012-11-24
                    相关资源
                    最近更新 更多