从用户输入字符串制作首字母缩略词

Making an acronym from user input string

提问人:Amanda Brown 提问时间:11/17/2023 最后编辑:Amanda Brown 更新时间:11/19/2023 访问量:55

问:

我需要我的程序输出首字母缩略词,但我很难找到一种方法来省略字符串中不是第一个字母的其他大写字母。例如,如果输入是“Awesome COOL Crazy”,我得到的输出是“ACOOLC”,而不是所需的“ACC”。

我对此非常陌生(您可能可以通过这个问题和代码来判断),因此任何提示都不胜感激。谢谢。

import java.util.Scanner;

public class LabProgram {
   
   public static String createAcronym(String userPhrase) {
      String newUserPhrase = userPhrase.replaceAll("\\s","");
      char acronymChar;
      String acronym = "";
      int i;
      
      for (i = 0; i < newUserPhrase.length(); ++i) {
         if ( (Character.isUpperCase(newUserPhrase.charAt(i))) ) {
            acronymChar = newUserPhrase.charAt(i);
            acronym += acronymChar + ".";
         }
      }
      return acronym;
   }
      
   public static void main(String[] args) {
      Scanner scnr = new Scanner(System.in);
      
      String userPhrase = scnr.nextLine();
      
      System.out.println(createAcronym(userPhrase));
   }
   }

我尝试实现一个 if 语句来读取用户字符串中的下一个字符,然后从最终首字母缩略词中删除该字符。

Java 字符串

评论

1赞 MadProgrammer 11/17/2023
而不是 do ,用于拆分空格上的文本。然后,对于每个元素,检查第一个字符,如果是大写字母,请将其附加到您的String newUserPhrase = userPhrase.replaceAll("\\s","");String#splitacronym
0赞 DevilsHnd - 退した 11/17/2023
一行:单字字符串:(前三个字符)或多字字符串:(每个单词的第一个字母) - 需要 Java8+: 确保不是 null 或 Empty:inputStringString acronym = (!inputString.contains(" ") ? inputString.toUpperCase().substring(0, 3) : java.util.Arrays.stream(inputString.split("\\s+")).map(t -> t.substring(0, 1).toUpperCase()).collect(java.util.stream.Collectors.joining("")));

答:

1赞 MadProgrammer 11/17/2023 #1

因此,与其删除所有空格,从而消除您确定单词边界的能力,不如简单地拆分 on 空格。String

这将为您提供一个单独的 s 数组,每个 s 代表原始文本中的一个单词。String

然后,检查每个单词的第一个字符是否大写,如果是,则将其附加到大写。acronym

例如。。。

public static String createAcronym(String userPhrase) {
    String[] words = userPhrase.split("\\s");
    String acronym = "";
    for (String word : words) {
        if (!word.isBlank() && Character.isUpperCase(word.charAt(0))) {
            acronym += Character.toString(word.charAt(0));
        }
    }
    return acronym;
}

因此,将输出的输入"Awesome COOL Crazy"ACC

我通常也会使用而不是串联,但我认为你现在有足够的能力来处理StringBuilderString

3赞 flash speedster 11/17/2023 #2

逻辑-

  1. 使用 split 将字符串分解为 Array。
  2. 获取每个数组元素的第一个字符
public class Main
{
    public static void main(String[] args) {
        String s = "Awesome COOL Crazy";
        String acronym = "";
        String sArray[] = s.split(" ");
        for(int i=0; i<sArray.length; i++) {
            acronym += sArray[i].charAt(0);
        }
        System.out.println(acronym);
    }
}

评论

0赞 Oleg Cherednik 11/19/2023
永远不要在循环中连接!String
1赞 Reilas 11/17/2023 #3

使用正则表达式模式以及 PatternMatcher 类。

(?i)(?<=^|\s)[a-z]
String s = "Awesome COOL Crazy";
StringBuilder b = new StringBuilder();
Pattern p = Pattern.compile("(?i)(?<=^|\\s)[a-z]");
Matcher m = p.matcher(s);
while (m.find()) b.append(m.group().toUpperCase());

或者,使用 String#replaceAll 方法。

(?i)(?<=[a-z]).*?(?:\s+|$)
String s = "Awesome COOL Crazy".trim().toUpperCase();
s = s.replaceAll("(?i)(?<=[a-z]).*?(?:\\s+|$)", "");

另一种解决方案是使用 String#split 方法。

String s = "Awesome COOL Crazy".trim().toUpperCase();
StringBuilder b = new StringBuilder();
char c;
for (String v : s.split(" +"))
    if (Character.isLetter(c = v.charAt(0))) b.append(c);

或者,利用 Scanner 类。

String s = "Awesome COOL Crazy".toUpperCase();
StringBuilder b = new StringBuilder();
Scanner sc = new Scanner(s);
char c;
while (sc.hasNext())
    if (Character.isLetter(c = sc.next().charAt(0))) b.append(c);

最后,利用 StringCharacterIterator 类。

String s = "Awesome COOL Crazy".trim().toUpperCase();
StringBuilder b = new StringBuilder();
StringCharacterIterator i = new StringCharacterIterator(s);
b.append(i.current());
do if (i.current() == ' ')
    do if (i.next() != ' ')
        if (Character.isLetter(i.current())) {
            b.append(i.current());
            break;
        }
    while (i.current() != CharacterIterator.DONE);
while (i.next() != CharacterIterator.DONE);
0赞 Oleg Cherednik 11/19/2023 #4
public static String getAcronyms(String str) {
    return Arrays.stream(str.split("\\s+"))
                 .map(word -> String.valueOf(word.charAt(0)))
                 .collect(Collectors.joining());
}
public static String getAcronyms(String str) {
    StringBuilder buf = new StringBuilder(str.length());

    for (int i = 0; i < str.length(); i++)
        if (i == 0 || str.charAt(i - 1) == ' ')
            buf.append(str.charAt(i));

    return buf.toString();
}