2010-07-20 166 views
4

在Java中是否有自動省略字符串的方法?只是在Java中,而不是其他庫。在Java中自動省略字符串

謝謝。

+2

Nvm ... btw我怎樣才能刪除評論?... – Alderath 2010-07-20 09:47:19

+3

'只是在Java中,而不是其他庫。「對不起,我應該開始閱讀這些問題:(儘管重用已有庫如' StringUtils'。這就是他們在這裏......它可以爲你節省一些工作。http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html – moxn 2010-07-20 10:14:06

+1

@moxn thanks for鏈接,我不知道這些,不幸的是,我必須小心導入新的外部JAR,也用於許可問題(我工作的項目是封閉源代碼),這個似乎是Apache 2.0,所以它不應該是有一個問題,對嗎? – 2010-07-20 12:34:58

回答

7

根據您的使用情況,將省略號放在字母(i。即在最後添加字母提供一些背景):

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

也有可能會從你省略號算法需要更復雜的功能:如果您需要將文本放入一個圖形元素,並且使用比例字體,那麼你必須測量字符串的長度。

對於Swing/AWT將是java.awt.Font.getStringBounds。在這種情況下,一個簡單的算法會一次將字符串切成一個字母並添加省略號,直到字符串符合給定的限制。如果經常使用,在http://www.codeproject.com/KB/cs/AutoEllipsis.aspx?msg=3278640(C#,但應該很容易轉換爲Java)中闡述的二分法可以節省一些處理器週期。

+0

我已經實現了你所建議的內容。謝謝! 我想我會嘗試提供一個通用的字符串橢圓化類,因爲現在我需要在類中快速入門,但值得花一些時間來開發一個好的API。 – 2010-07-20 12:37:15

+0

我認爲你應該使用省略號字符,...,而不是三個點,可能會劃分在一行的末尾(appart從只有1長度而不是3) – 2012-10-17 11:51:27

+0

@Wakka你是對的,如果省略號可用輸出,那麼它可能是一個不錯的選擇(例如當使用Swing時)。對於某些應用程序,也應該可接受三個點:如果目標不支持省略號字符(例如,如果輸出使用ISO-8859-1)或固定寬度的字體,其中省略號只需要一個寬度而不是3。 – 2012-10-17 14:06:29

3

沒有。但這是另一個簡單的方法來解決這個問題。

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

當然,試試這個:

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

這具有固定在國王的英語使用不當:-)

+0

國王'英語 - 對不起? – Buffalo 2016-06-21 11:32:27

+0

@Buffalo,你正在延伸我的記憶,這個答案在六年前發佈。然而,我懷疑我的意思是國王的英語(而不是古雅的美國變體)在'ellipsise'這樣的單詞末尾使用'ise'(而不是'ize')。這是我最好的猜測,因爲它帶有俏皮的笑臉和我用不同的方式拼寫的事實。 – paxdiablo 2016-06-21 12:10:09

4

的bug利用這種方法將返回字符串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

一個oneliner這當然不優於其他提供的解決方案:

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

將只留下第一個和最後5個字符,並把...夾在中間。