【问题标题】:Reduce text length to fit cell width in a smart manner以智能方式减少文本长度以适应单元格宽度
【发布时间】:2011-03-01 14:33:30
【问题描述】:

我在项目中使用 Java EE 技术构建一个简单的网络日历。

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

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

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

有什么聪明的方法吗?或者删除人声/将字符串一分为二就足够了?

【问题讨论】:

  • 单元格尺寸是否固定?字符串是常量还是动态创建的?
  • 单元格尺寸可调?从数据库中检索字符串。任何东西都可能在那里。甚至是小说……
  • 我希望网络日历不供国际使用。您的缩写在其他语言中可能会变得毫无意义。

标签: java algorithm string


【解决方案1】:

对我来说,使用可变缩写根本不是一件好事 - 它会导致歧义,进而导致错误的解释和错误的决定。

典型的方法(来自簿记/财务系统中的交易描述)是建立和维护缩写字典的设施。 (这也有助于验证或转换数据输入,而不仅仅是输出的呈现)。

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

此外,您应该有一种统一的方式来显示哪些单元格已被裁剪。

【讨论】:

    【解决方案2】:

    Perl 有 Lingua::EN::Squeeze,但该算法似乎无法生成可读性极强的文本; http://search.cpan.org/~jariaalto/Lingua-EN-Squeeze-2006.0704/Squeeze.pm

    你可以试试 SMS Speak; http://en.wikipedia.org/wiki/SMS_language

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      写...

      在单元格中,

      编写文档

      在工具提示中。

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

      【讨论】:

        【解决方案4】:

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

        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
        

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

        【讨论】:

          【解决方案5】:

          对我来说,“Wrtng. dcmnts”看起来很糟糕(但那可能只是我)。

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

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

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

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

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

          【讨论】:

          • 问题是我不知道数据库中的“文本”是什么。单词不是固定的,它可以是英语中的任何东西。我正在努力寻找正确的方法。
          • @Andrei,您也可以在数据库中拥有短版本。
          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-17
            • 2020-04-22
            • 2018-02-28
            • 2015-05-04
            • 1970-01-01
            • 2019-01-09
            • 2011-01-24
            • 1970-01-01
            相关资源
            最近更新 更多