Как использовать первое слово в строке с заглавной буквы и манипулировать последним словом на основе длины слова в данной строке

Предположим, что задана строка this is a book .

Условие: Изменить для каждой буквы в строке заглавную букву, а если слова в строке определены как более 3 букв, заменить 4-ю букву на . точка, в результате чего точка конкатенируется, представляя собой 3 точки

Здесь,

Выход будет

Это ... Бу ...

Программу пробовал, но не смог заменить последний символ как точку на три точки.

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);

Как я могу считать и конкатенировать как таковой? Есть ли способ, как мы можем это проверить?


person Ranjit M    schedule 22.06.2020    source источник
comment
СОВЕТ: if (token.length() == 4)...   -  person Kevin Anderson    schedule 22.06.2020
comment
Я думаю, токен не придет. Еще намек   -  person Ranjit M    schedule 22.06.2020
comment
У @KevinAnderson есть правильный намек для вас. Прежде чем добавить токен в верхнем регистре к StringBuilder, сначала проверьте, действительно ли токен имеет длину 4. И если да, замените последний символ тремя точками.   -  person maloomeister    schedule 22.06.2020


Ответы (5)


Ниже показано, как вы можете сделать это в одном выражении:

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+ — это шаблон регулярного выражения, который указывает один или несколько пробелов. Проверьте это чтобы узнать больше о шаблонах регулярных выражений
  4. Карта потока#a>
  5. Строка#подстрока. Обратите внимание, что он имеет два варианта.
  6. String#replaceAll
  7. . в качестве шаблона регулярного выражения указывает каждый символ.
  8. Поток#длякаждого

Демо:

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....

Если вы хотите создать одну строку, собрать поток в Список и объединить элементы используя " " в качестве разделителя.

Демо:

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(" "))) вместо [сбора в List с помощью .collect(Collectors.toList()) и последующего объединения элементов List с помощью String.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 = 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);
    }
}
person Arvind Kumar Avinash    schedule 22.06.2020
comment
Круто, collect(Collectors.toList()) как это добавить в список и почему только это? Здесь .collect(Collectors.joining(" "))); можно использовать для получения того же результата. Также почему //s+ , как и в шлейфе, дальше пробела нет, зачем это нужно? - person Ranjit M; 22.06.2020
comment
Спасибо, @RezD'Souza за добрые слова. - person Arvind Kumar Avinash; 22.06.2020
comment
why \\s+ - На всякий случай между словами больше одного пробела. - person Arvind Kumar Avinash; 22.06.2020
comment
Я понял, хорошо, но в чем смысл использования collect(Collectors.toList()), а не collect(Collectors.joining(" ")))? - person Ranjit M; 22.06.2020
comment
Это хорошее предложение. Я добавил ваше предложение в качестве обновления. - person Arvind Kumar Avinash; 22.06.2020
comment
Хотя я также добавил ответ, который находится ниже, но он подходит лучше, проголосовал и принял. - person Ranjit M; 22.06.2020

Как прокомментировал Кевин, вы можете проверить длину и добавить .,

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(" ");
}
person Vikas Yadav    schedule 22.06.2020
comment
Этот ответ слишком переполнен, чтобы быть полезным объяснением. Также: это должно быть token.length()-1 для получения правильных результатов. - person maloomeister; 22.06.2020

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.

person Sercan    schedule 22.06.2020

Спасибо, я также изменил его через 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();
        }

Работает.

person Ranjit M    schedule 22.06.2020

Вы можете попробовать изменить код, как показано ниже.

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);
person Zia    schedule 22.06.2020