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?
5 Réponses :
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(" "); }
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.
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.
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.
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:
\\ 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 .
en tant que modèle d'expression régulière spécifie chaque caractère. Thi. Is A Boo....
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. Sortie: [Mise à jour] Avec l'aimable autorisation de Rez D'Souza . Ça peut être plus optimisé en utilisant 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);
}
}
Démo:
Thi.
Is
A
Boo....
.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);
}
}
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é.
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);
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.