Chaîne de taille divisé en lignes avec un maximum de longueur en java
String input = "THESE TERMS AND CONDITIONS OF SERVICE (the Terms) ARE A LEGAL AND BINDING AGREEMENT BETWEEN YOU AND NATIONAL GEOGRAPHIC governing your use of this site, www.nationalgeographic.com, which includes but is not limited to products, software and services offered by way of the website such as the Video Player, Uploader, and other applications that link to these Terms (the Site). Please review the Terms fully before you continue to use the Site. By using the Site, you agree to be bound by the Terms. You shall also be subject to any additional terms posted with respect to individual sections of the Site. Please review our Privacy Policy, which also governs your use of the Site, to understand our practices. If you do not agree, please discontinue using the Site. National Geographic reserves the right to change the Terms at any time without prior notice. Your continued access or use of the Site after such changes indicates your acceptance of the Terms as modified. It is your responsibility to review the Terms regularly. The Terms were last updated on 18 July 2011.";
//text copied from http://www.nationalgeographic.com/community/terms/
Je veux partager cette chaîne de taille en lignes et les lignes ne doivent pas le contenu plus que MAX_LINE_LENGTH caractères de chaque ligne.
Ce que j'ai essayé jusqu'à présent
int MAX_LINE_LENGTH = 20;
System.out.print(Arrays.toString(input.split("(?<=\\G.{MAX_LINE_LENGTH})")));
//maximum length of line 20 characters
De sortie :
[THESE TERMS AND COND, ITIONS OF SERVICE (t, he Terms) ARE A LEGA, L AND B ...
Il provoque rupture de mots. Je ne veux pas de cela.
Au lieu de je veux obtenir une sortie comme ceci:
[THESE TERMS AND , CONDITIONS OF , SERVICE (the Terms) , ARE A LEGAL AND B ...
Une condition ajouté :
Si un mot de longueur est supérieure à MAX_LINE_LENGTH alors ce mot doit obtenir split.
Et la solution doit être sans aide extérieure pots.
- double possible de code Java pour l'emballage des lignes de texte pour un max de largeur de ligne
- mon client ne veut pas de moi pour l'utilisation externe des fichiers jar. Je n'ai pas toute la solution dans ce thread que vous avez mentionné, sans externe des fichiers jar.
- Ouais...juste fait.
Vous devez vous connecter pour publier un commentaire.
Viens de parcourir la chaîne de mot en mot et pause à chaque fois qu'un mot de passe à la limite.
J'ai tapé juste que, à main levée, vous pourriez avoir à pousser et pousser un peu pour faire de la compilation.
Bug: si un mot dans l'entrée est plus que
maxLineLength
, elle sera ajoutée à la ligne actuelle au lieu de sur une trop longue ligne de sa propre. Je suppose que votre longueur de ligne est quelque chose comme 80 ou 120 caractères, dans ce cas, il est peu probable d'être un problème.String word = tok.nextToken()+" ";
Mieux : l'utilisation d'Apache Commons Lang :
org.apache.commons.lang.WordUtils
Grâce Barend Garvelink pour votre réponse. J'ai modifié le code ci-dessus pour fixer le
Bug: "si un mot dans l'entrée est plus que maxCharInLine"
Vous pouvez utiliser WordUtils.méthode d'enveloppement de Apache Commans Lang
Sortie
À partir de @Barend la suggestion, voici ma version finale avec des modifications mineures :
Sorties :
J'ai récemment écrit un peu de méthodes pour ce faire que, si aucune espaces sont présents dans l'une des lignes, opte pour la séparation d'autres caractères non alphanumériques avant de recourir à une évaluation à mi-mot split.
Ici est de savoir comment il s'est avéré pour moi:
(Utilise le
lastIndexOfRegex()
méthodes que j'ai posté ici.)Ma version(La précédente n'ont pas de travail)
Depuis Java 8 vous pouvez également utiliser Flux pour s'attaquer à ces problèmes.
Suivant vous pouvez trouver un exemple complet qui utilise Réduction à l'aide de l' .collect() méthode
Je pense que celui-ci devrait être plus courte que les autres non-3e partie des solutions.