1
votes

Comment mettre en majuscule le premier mot d'une chaîne et manipuler le dernier mot en fonction de la longueur du mot dans une chaîne donnée

Supposons que la chaîne donnée soit "ceci est un livre".

Condition: à Changer pour chaque lettre de la chaîne en majuscule et si les mots par chaîne définis à plus de 3 lettres, remplacez la 4ème lettre par "." point, rendant le point concaténé représentant enfin 3 points

Ici,

La sortie sera

Thi ... Is A Boo ...

Programme que j'ai essayé, mais je n'ai pas pu remplacer le dernier caractère par un point par trois points.

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

Comment puis-je compter et concaténer comme tel? Existe-t-il un moyen de vérifier cela?


3 commentaires

ASTUCE: if (token.length () == 4) ...


Je pense que le jeton ne viendra pas. Plus d'indices


@KevinAnderson a le bon indice pour vous. Avant d'ajouter votre jeton Majuscules au StringBuilder, vérifiez d'abord si le jeton est réellement de longueur 4. Et si tel est le cas, remplacez le dernier caractère par les trois points.


5 Réponses :


1
votes

Comme l'a commenté Kevin, vous pouvez vérifier la longueur et ajouter .,

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(" ");
}


1 commentaires

Cette réponse est bien trop chargée pour être une explication utile. Aussi: il devrait être token.length () - 1 pour produire les bons résultats.



1
votes
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(" ");
}
So here it converts each first letter to uppercase, then checks length and manipulate if it is bigger than 3, and finally append them in str.

0 commentaires

0
votes

Merci, je l'ai également changé via Streams pour avoir une méthode:

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

Fonctionne.


0 commentaires

0
votes

Voici comment vous pouvez le faire en une seule instruction:

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

Explication:

  1. Arrays.stream
  2. Chaîne # split
  3. \\ s + est un modèle d'expression régulière qui spécifie un ou plusieurs espaces. Vérifiez ceci pour en savoir plus sur les modèles d'expression régulière
  4. Stream # map
  5. Chaîne # sous-chaîne . Notez qu'il a deux variantes.
  6. Chaîne # replaceAll
  7. . en tant que modèle d'expression régulière spécifie chaque caractère.
  8. Flux # forEach

Demo:

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

Si vous souhaitez créer une seule chaîne, collecter le flux dans un List et joindre les éléments en utilisant "" comme délimiteur.

Démo:

Thi.
Is
A
Boo....

Sortie:

XXX

[Mise à jour] Avec l'aimable autorisation de Rez D'Souza .

Ça peut être plus optimisé en utilisant .collect (Collectors.joining (""))) au lieu de [collecte vers List en utilisant .collect (Collectors.toList ()) puis en joignant les éléments de la List en utilisant String.join .

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


6 commentaires

Génial, collectez (Collectors.toList ()) comment cela s'ajoute à la liste et pourquoi seulement cela? Ici, .collect (Collectors.joining (""))); peut être utilisé pour récupérer le même résultat. Aussi, pourquoi // s + , comme dans la piste, il n'y a plus d'espace blanc, pourquoi est-ce nécessaire?


Merci, @ RezD'Souza pour les aimables paroles.


why \\ s + - Pour juste au cas où il y aurait plus d'un espace entre les mots.


J'ai compris, d'accord, mais quelle est la pertinence d'utiliser collect (Collectors.toList ()) et non collect (Collectors.joining (""))) ?


C'est une bonne suggestion. J'ai ajouté votre suggestion en tant que mise à jour.


Bien que j'ai également ajouté sa réponse ci-dessous, mais cela convient mieux, voté et accepté.



0
votes

Vous pouvez essayer de modifier le code comme ci-dessous

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


0 commentaires