【问题标题】:intelligent path truncation/ellipsis for display智能路径截断/省略显示
【发布时间】:2010-12-12 23:34:16
【问题描述】:

我正在寻找一种存在路径截断算法(类似于 Win32 静态控件对 SS_PATHELLIPSIS 所做的),用于一组应该专注于不同元素的路径。

例如,如果我的路径是这样的:

 Unit with X/Test 3V/
 Unit with X/Test 4V/
 Unit with X/Test 5V/
 Unit without X/Test 3V/
 Unit without X/Test 6V/
 Unit without X/2nd Test 6V/

当没有足够的显示空间可用时,它们应该被截断为这样的:

 ...with X/...3V/
 ...with X/...4V/
 ...with X/...5V/
 ...without X/...3V/
 ...without X/...6V/
 ...without X/2nd ...6V/

(假设省略号一般少于三个字母)。

这只是一个相当简单的理想案例的示例(例如,它们现在都会以不同的长度结束,而且当路径“Thingie/Long Test/”时,我不知道如何创建一个好的建议已添加到池中)。

路径元素没有给定的结构,它们是由用户指定的,但通常项目会有相似的段。它应该适用于比例字体,因此算法应该采用测量函数(而不是大量调用它)或生成建议列表。

在数据方面,一个典型的用例将包含 2..4 个路径段和每个段 20 个元素。

我正在寻找以前对该方向的尝试,以及是否可以通过合理数量的代码或依赖项来解决。

【问题讨论】:

  • 一个聪明有趣的问题。

标签: algorithm string path


【解决方案1】:

我假设您主要询问如何处理从同一层次结构中提取的文件夹名称集,因为按行和路径分隔符拆分以及按层次结构深度聚合很简单。

你的问题让我想起了很多longest common substring problem,区别在于:

  1. 您对许多子字符串感兴趣,而不仅仅是一个。
  2. 您关心订单。

这些可能看起来很重要,但如果您检查文章中的动态规划解决方案,您会发现它围绕创建“字符冲突”表,然后在该表中查找最长的对角线。我认为您可以改为按出现的顺序枚举表中的所有对角线,然后为每个路径按顺序替换这些字符串的所有外观。

强制最小子字符串长度为 2 将返回类似于您在问题中概述的结果。

似乎确实需要对算法进行一些修改(例如,确保某个子字符串在所有字符串中排在第一位),然后您需要在整个集合中调用它...我希望这至少能给您一个可能的方向。

【讨论】:

    【解决方案2】:

    好吧,“自然数”排序部分实际上很简单,只需将所有数字替换为有足够前导零的格式化数字,例如。 Test 9V -> Test 000009VTest 12B -> Test 000012B。这些现在可以按标准方法排序。

    对于实际的省略号。除非这实际上是一个巨大的系统,否则我只会添加手动省略“列表”(正则表达式,为了灵活性和痛苦),它将某些单词变成省略号。这确实需要持续的工作,但提出算法也会占用您的时间;有无数的极端案例。

    我可能会尝试“Floodfill”方法。像位图一样排列第一级目录,每个字母都是一个像素。遍历目录名称中的所有字符。使用所有这些,“绘制”同一个字符,然后从第一个字符串“绘制”下一个字符,使其跟在前一个字符之后(依此类推)。然后选择您找到的最长的绘制字符串。

    示例(如果以 * 为前缀,则为已绘制)

    Foo
    BarFoo
    
    *Foo
    Bar*Foo
    
    *F*oo
    Bar*F*oo
    
    ...
    

    注意:

    *ofoo
    b*oo
    
    *o*foo
    b*oo
    .. painting of first 'o' stops since there are no continuing characters.
    
    of*oo
    b*oo
    ...
    

    然后你到第二个“o”,它会找到一个至少为 2 的子字符串。 所以你将不得不迭代大多数可能的字符实例(一个优化是在每个字符串中停止在位置 Length-n 处,其中 n 是已经找到的最长的公共子字符串。但是还有另一个问题(这里是"Beta Beta"

              | <- visibility cutout
    Alfa Beta Gamma Delta 1
    Alfa Beta Gamma Delta 2
    Alfa Beta Beta 1
    Alfa Beta Beta 2
    Beta Beta 1
    Beta Beta 2
    Beta Beta 3
    Beta Beta 4
    

    你想做什么?剪切Alfa Beta Gamma DeltaAlfa BetaBeta BetaBeta

    这有点漫无边际,但可能很有趣:)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2017-01-09
      • 2019-12-11
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多