提问人:Amanda Brown 提问时间:11/17/2023 最后编辑:Amanda Brown 更新时间:11/19/2023 访问量:55
从用户输入字符串制作首字母缩略词
Making an acronym from user input string
问:
我需要我的程序输出首字母缩略词,但我很难找到一种方法来省略字符串中不是第一个字母的其他大写字母。例如,如果输入是“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 语句来读取用户字符串中的下一个字符,然后从最终首字母缩略词中删除该字符。
答:
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
我通常也会使用而不是串联,但我认为你现在有足够的能力来处理StringBuilder
String
3赞
flash speedster
11/17/2023
#2
逻辑-
- 使用 split 将字符串分解为 Array。
- 获取每个数组元素的第一个字符
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
使用正则表达式模式以及 Pattern 和 Matcher 类。
(?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();
}
评论
String newUserPhrase = userPhrase.replaceAll("\\s","");
String#split
acronym
inputString
String 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("")));