如何将字符串中的第一个单词大写,并根据给定字符串中的单词长度处理最后一个单词

How to capitalise first word in a String, and manipulate the last word based on word's length in a given string

Suppose String given is " this is a book ".

条件: 将字符串中的每个字母更改为大写字母,如果每个字符串中的单词定义为超过 3 个字母,则将第 4 个字母替换为“.”点,最后连起来的点代表3个点

这里,

输出将是

Thi... Is A Boo...

我试过的程序,但无法将最后一个字符替换为三个点。

public class Tip2 {

    public static void main(String[] args) {
        StringBuilder str = new StringBuilder();
        String testString = "this is a book";
        String[] tokens = testString.split("\s");

        for (String token : tokens) {
            str.append(Character.toUpperCase(token.charAt(0))).append(token.substring(1)).append(" ");
        }
        str.toString().trim();
System.out.println(str);

我怎样才能这样计算和连接?有什么办法可以检查吗?

正如 Kevin 所说,您可以检查长度并附加 .

for (String token : tokens) {
    String subString = token.length() == 4 ? token.substring(1, token.length()-1)+"..." : token.substring(1);
    str.append(Character.toUpperCase(token.charAt(0))).append(subString).append(" ");
}
for (String token : tokens){
    token = token.substring(0, 1).toUpperCase() + token.substring(1);
    if (token.length() > 3){
        token = token.substring(0, 3) + "...";
    }
    str.append(token).append(" ");
}

所以在这里它将每个首字母转换为大写,然后检查长度并处理它是否大于 3,最后将它们附加到 str.

谢谢,我还通过 Streams 将其更改为一种方法:

    try{
                Stream.of(testString.split(" ")).forEach(s -> {
                    if (s.length() > 3) {
    
                        System.out.print(s.substring(0,1).toUpperCase().concat(s.substring(1,3).concat("...")+" "));
                    }
                    else{
                        System.out.print(s.substring(0,1).toUpperCase().concat(s.substring(1,s.length()))+" ");
                    }
                });
            }catch (StringIndexOutOfBoundsException ex){
               

 ex.printStackTrace();
        }

正在工作。

下面给出了如何在一条语句中完成:

Arrays.stream(str.split("\s+"))
                .map(s -> s.substring(0, 1).toUpperCase()
                        + (s.length() > 3 ? (s.substring(1, 3) + s.substring(3).replaceAll(".", ".")) : s.substring(1)))
                .forEach(System.out::println);

解释:

  1. Arrays.stream
  2. String#split
  3. \s+ 是一个正则表达式模式,它指定一个或多个 space(s)。检查 this 以了解有关正则表达式模式的更多信息
  4. Stream#map
  5. String#substring。请注意,它有两个变体。
  6. String#replaceAll
  7. . 作为正则表达式模式指定每个字符。
  8. Stream#forEach

演示:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String str = "this is a booking";
        Arrays.stream(str.split("\s+"))
                .map(s -> s.substring(0, 1).toUpperCase()
                        + (s.length() > 3 ? (s.substring(1, 3) + s.substring(3).replaceAll(".", ".")) : s.substring(1)))
                .forEach(System.out::println);
    }
}

输出:

Thi.
Is
A
Boo....

如果要创建单个字符串,collect the stream into a List and join 元素使用 " " 作为分隔符。

演示:

import java.util.Arrays;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String str = "this is a booking";
        String result = String.join(" ",
                Arrays.stream(str.split("\s+")).map(s -> s.substring(0, 1).toUpperCase()
                        + (s.length() > 3 ? (s.substring(1, 3) + s.substring(3).replaceAll(".", ".")) : s.substring(1)))
                        .collect(Collectors.toList()));

        System.out.println(result);
    }
}

输出:

Thi. Is A Boo....

[更新] .

可以通过使用.collect(Collectors.joining(" ")))而不是[使用.collect(Collectors.toList())[收集到List然后使用[=加入List的元素来进一步优化23=]].

import java.util.Arrays;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String str = "this is a booking";
        String result = Arrays.stream(str.split("\s+"))
                .map(s -> s.substring(0, 1).toUpperCase()
                        + (s.length() > 3 ? (s.substring(1, 3) + s.substring(3).replaceAll(".", ".")) : s.substring(1)))
                .collect(Collectors.joining(" "));
        System.out.println(result);
    }
}

您可以尝试修改如下代码

for (String token : tokens) {
        if(token.length() > 3) {
            token = token.replace(token.substring(3),"...");
        }
        
 str.append(Character.toUpperCase(token.charAt(0))).append(token.substring(1)).append(" ");
    }
    str.toString().trim();
    System.out.println(str);