以智能方式缩小文本长度以适合单元格宽度

时间:2010-06-09 10:37:11

标签: java algorithm string

我正处于使用Java EE技术构建简单Web日历的项目中。

我们定义一个表,其中每一行都是一个雇员,每列代表一个小时的间隔。表格宽度和列宽可调。在每个单元格中,我们都有一个从数据库中检索到的文本,指示员工在该时间间隔内正在/应该做什么。

问题在于,有时单元格中的文本比实际单元格更大。 我的任务是通过以“智能方式”减少文本的长度来使文本更“可读”,以便它可以更“优雅”地适应单元格。

例如,如果最初在一个单元格中我有:“写文档”,在调整大小后我应该检索:“Wrtng.dcmnts”或“Writ.docum”。这样文本就可以很好地适应了。

有一种聪明的方法吗?或者删除人声/将字符串分成两部分就足够了?

6 个答案:

答案 0 :(得分:2)

如果您无法存储缩写词,您可能会遇到一些规则,例如:

if the string is too long
  remove the two rightmost vowels and append a .
  do while the string is too long and there are any vowels left
     remove vowels one at a time from the right
  do while the string is too long
     remove a consonant from the right end of the rightmost word
     if the string is still too long
         remove a consonant from the last word but one
         ...

你得到的图片,它是繁琐但不是火箭科学。

您可以将此功能与常用字词和常用字母组的一组重写规则结合使用。例如:

customer -> custmr -> cust -> cst
ation -> tn

我怀疑首先应用规则,然后缩写算法会给出更令人满意的结果。

答案 1 :(得分:2)

我正在添加另一个答案,因为我提供了一种不同的方法:不使用缩写版本的单词,当全文不适合时,您可以使用尾随点“...”来表示还有更多文本,并在悬停单元格时显示工具提示中的完整版本:

  

...以创作

在单元格中,

  

撰写文件

在工具提示中。

这样,您的程序也可以很好地用于国际用途,并且保持相同字符串的多个版本的空间要求消失。

答案 2 :(得分:1)

保留根据容器大小显示的此类字符串的多个版本。

答案 3 :(得分:1)

对我而言,“Wrtng。dcmnts”看起来很可怕(但这可能就是我)。

我可以想象使用更长版本到更短版本的映射,例如

"Writing" -> "Writ."
"Documents" -> "Doc."
"Writ." -> Wr."
"Doc." -> "D."

等,然后根据单元格大小选择正确的。

或者,如果您没有大量的单词组合,也可以映射整个任务名称:

"Writing Documents" -> "Writ. Doc."
"Writ. Doc." -> Wr. D."

答案 4 :(得分:1)

Perl有Lingua :: EN :: Squeeze,但该算法似乎不会产生非常易读的文本; http://search.cpan.org/~jariaalto/Lingua-EN-Squeeze-2006.0704/Squeeze.pm

你可以试试短信讲话; http://en.wikipedia.org/wiki/SMS_language

盲文使用一些短文版本; http://www.brl.org/intro/session09/short.html

另一种选择可能是使用CSS文本溢出声明; http://www.quirksmode.org/css/textoverflow.html

无论如何,在向用户显示之前,您可能最终不得不进行一些字符串或正则表达式替换。

您可能还想考虑使用“title”属性或类似属性,以允许用户将鼠标悬停在缩位文本上以获取原始文件的弹出窗口。

答案 5 :(得分:1)

对我来说,拥有可变缩写并不是一件好事 - 它可能导致歧义,这反过来会导致错误的解释和错误的决定。

典型的方法(来自簿记/财务系统中的交易描述)是建立和维护缩写词典的工具。 (这也可以帮助验证或转换数据输入,而不仅仅是输出的表示。)

无论如何你看问题(或者一些类似的焦点/细节UI功能),工具提示都是一个很好的解决方案。

此外,您应该有一种统一的方式来显示已裁剪的细胞。