2010-07-20 3 views
4

Existe-t-il une méthode en Java pour ellipser automatiquement une chaîne? Juste en Java, pas d'autres bibliothèques.Ellipse automatiquement une chaîne en Java

Merci.

+2

Nvm ... Btw comment puis-je supprimer les commentaires? ... – Alderath

+3

'Juste en Java, pas d'autres bibliothèques. 'Désolé, je devrais commencer à lire les questions :(Bien qu'il soit de bonne pratique de réutiliser des bibliothèques existantes comme' StringUtils. C'est ce qu'ils sont ici pour ... Et cela pourrait vous faire économiser un peu de travail http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html – moxn

+1

@moxn merci pour le lien, je ne savais pas à ce sujet.Malheureusement, je dois faire attention à importer de nouveaux fichiers JAR externes, aussi pour les problèmes de licence (projet sur lequel je travaille est une source fermée) .Cela semble être Apache 2.0 donc il ne devrait pas être un problème., right? –

Répondre

7

en fonction de votre cas d'utilisation, il peut être utile de mettre les points de suspension entre les lettres (i. e. ajouter des lettres à la fin de fournir un contexte):

/** 
* Puts ellipses in input strings that are longer than than maxCharacters. Shorter strings or 
* null is returned unchanged. 
* @param input the input string that may be subjected to shortening 
* @param maxCharacters the maximum characters that are acceptable for the unshortended string. Must be at least 3, otherwise a string with ellipses is too long already. 
* @param charactersAfterEllipsis the number of characters that should appear after the ellipsis (0 or larger) 
* @return the truncated string with trailing ellipses 
*/ 
public static String ellipsize(String input, int maxCharacters, int charactersAfterEllipsis) { 
    if(maxCharacters < 3) { 
    throw new IllegalArgumentException("maxCharacters must be at least 3 because the ellipsis already take up 3 characters"); 
    } 
    if(maxCharacters - 3 > charactersAfterEllipsis) { 
    throw new IllegalArgumentException("charactersAfterEllipsis must be less than maxCharacters"); 
    } 
    if (input == null || input.length() < maxCharacters) { 
    return input; 
    } 
    return input.substring(0, maxCharacters - 3 - charactersAfterEllipsis) + "..." + input.substring(input.length() - charactersAfterEllipsis); 
} 

Il y a aussi des fonctionnalités plus sophistiquées, vous voudrez peut-être de votre algorithme ellipsis: Si vous devez placer le texte dans un élément graphique et que vous utilisez une police proportionnelle , alors vous devez mesurer la longueur de la chaîne.

Pour Swing/AWT, cela correspond à java.awt.Font.getStringBounds. Dans un tel cas, un simple algrithme couperait la chaîne une lettre à la fois et ajouterait l'ellipse, jusqu'à ce que la chaîne s'insère dans la limite donnée. Si elle est utilisée souvent, la méthode de bissection élaborée en http://www.codeproject.com/KB/cs/AutoEllipsis.aspx?msg=3278640 (C#, mais devrait être assez facile à traduire en Java) peut sauver quelques cycles de processeur.

+0

J'ai mis en place quelque chose dans le sens de ce que vous avez suggéré. Merci! Je pense que j'essaierai de fournir un cours général d'ellipses, car pour l'instant j'ai besoin d'un hack rapide à l'intérieur d'une classe, mais cela vaut la peine d'investir du temps et de développer une bonne API. –

+0

Je pense que vous devriez utiliser les ellipses char, ..., pas trois points, qui peuvent être divisés en fin de ligne (appart d'être seulement 1 longueur au lieu de 3) –

+0

@Wakka vous avez raison, si l'ellipse est disponible sur la sortie, alors il peut être un bon choix (par exempleen utilisant Swing). Pour certaines applications, trois points doivent également être acceptés: Si la cible ne prend pas en charge le caractère ellipse (par exemple, si la sortie utilise ISO-8859-1) ou pour les polices de largeur fixe, l'ellipse ne prend qu'une largeur au lieu de 3. –

3

Il n'y en a pas. Mais voici une autre fissure à une méthode simple pour le faire.

String ellipsize(String input, int maxLength) { 
    if (input == null || input.length() < maxLength) { 
    return input; 
    } 
    return input.substring(0, maxLength) + "..."; 
} 
1

Bien sûr, essayez celui-ci:

public static String ellipsise (String input, int maxLen) { 
    if (input == null) 
     return null; 
    if ((input.length() < maxLen) || (maxLen < 3)) 
     return input; 
    return input.substring (0, maxLen - 3) + "..."; 
} 

Ceci a l'avantage de fixer le bug est pas utilisé correctement :-)

+0

Le roi s Anglais - désolé ?! – Buffalo

+0

@Buffalo, tu m'étires un peu la mémoire, cette réponse a été postée il y a six ans. Cependant, je soupçonne que je voulais dire que l'anglais du roi (plutôt que la variante américaine pittoresque) utilise 'ise' (pas' ize') à la fin des mots comme 'ellipsise'. Ce serait ma meilleure supposition étant donné le smiley ludique et le fait que je l'ai épelé différemment. – paxdiablo

4

anglais du roi Cette méthode retourne la chaîne ellipsized :

String ellipsize(String input, int maxLength) { 
    String ellip = "..."; 
    if (input == null || input.length() <= maxLength 
      || input.length() < ellip.length()) { 
     return input; 
    } 
    return input.substring(0, maxLength - ellip.length()).concat(ellip); 
} 
3

Un oneliner qui bien sûr ne surperformer pas les autres solutions proposées:

longString.replaceFirst("(.{5}).+(.{5})", "$1...$2") 

partirez seulement le premier et le dernier 5 caractères et mettre ... au milieu.