ultramarine

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  0 Posts :: 9 Stories :: 0 Comments :: 0 Trackbacks

这是一个规则(即折行时不能拦腰截断单个单词)显示英文段落的例子,使用的JDK版本是1.3.



 


我在实践中曾遇到这样一个问题,,把从MySQL数据库拿到的TEXT类型的英文字符按照指定的单行显示长度规则地(即折行时不能拦腰截断单个单词)显示在画面上.

由于当时的实际情况是用JDK1.3的方式解决,所以当时还真的费了些脑筋,解决这个问题大概花了两个小时.下面就是例程.其基本思路是,先按空格取出字符串中的单词,再按指定的长度把单词拼成行.

/*
 * Copyright (c) 2004 zhangzengzhi
 * All rights reserved.
 * $
 */
import java.util.ArrayList;
import java.util.List;
/**
 * @author 张增志---zhangzengzhi
 * @version 1.0 2004/11/29 Created initially.
 *
 * EnWordsTest.java
 *
 */
public class EnWordsTest {
    private static List wordsList = new ArrayList();
    private static List enWordsList = new ArrayList();
    private static void resolveEnWords(String p_sentence) {
        String sentence = p_sentence;
        if (p_sentence.indexOf(" ") != -1) {
            int i_comma = sentence.indexOf(" ");
            String temp = sentence.substring(0, i_comma);
            wordsList.add(temp);
            sentence = sentence.substring(i_comma + 1, p_sentence.length());
            resolveEnWords(sentence);
        } else {
            wordsList.add(sentence);
        }
    }
    private static List getWordsList(String p_sentence) {
        wordsList.clear();
        resolveEnWords(p_sentence);
        return wordsList;
    }
    private static void splitEnWordsToList(List wordsList, int len) {
        List t_list = wordsList;
        String t_word = "";
        int word_len = 0;
        for (int i = 0; i < t_list.size(); i++) {
            String word = (String) t_list.get(i);
            word_len += word.length() + 1;
            if (word_len <= len) {
                t_word = t_word + word + " ";
                if (i == t_list.size() - 1) {
                    enWordsList.add(t_word.trim());
                    return;
                }
            } else {
                word_len = 0;
                enWordsList.add(t_word);
                splitEnWordsToList(t_list.subList(i, t_list.size()), len);
                return;
            }
        }
    }
    /**
     * split a English String to List according to specific length.

     *
     * Bug1: len < word.length() then throw java.lang.StackOverflowError

     *
     * @param p_sentence English String
     * @param len display length of one line
     * @return String List
     */
    public static List getSplitEnWordsList(String p_sentence, int len) {
        enWordsList.clear();
        if (p_sentence != null && !p_sentence.equals("")) {
            List words = getWordsList(p_sentence);
            if (words.size() == 1) {
                return words;
            }
            splitEnWordsToList(words, len);
        }
        return enWordsList;
    }
}
上述例程中已知的一个BUG是单行显示长度如小于某个英文单词的长度,就会出错.但是这种情况在实际中出现的可能性几乎没有,所以当时就只作记录而忽略处理了.
posted on 2005-09-23 11:19 ultramarine 阅读(187) 评论(0)  编辑  收藏 所属分类: eclipse&Java