Algorithm 用于显示的智能路径截断/省略号

Algorithm 用于显示的智能路径截断/省略号,algorithm,string,path,Algorithm,String,Path,我正在寻找一种现有的路径截断算法(类似于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/ ...w

我正在寻找一种现有的路径截断算法(类似于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/
当没有足够的显示空间可用时,应将其截断为以下内容:

 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个元素


我正在寻找以前在这个方向上的尝试,如果可以通过合理的代码量或依赖性来解决这个问题。

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

你们的问题让我想起了很多,但不同之处在于:

  • 您对许多子字符串感兴趣,而不仅仅是一个
  • 你关心秩序
  • 这些可能看起来很重要,但是如果您研究本文中的动态编程解决方案,您会发现它围绕着创建一个“角色冲突”表,然后在该表中查找最长的对角线。我认为您可以按照对角线的出现顺序来枚举表中的所有对角线,然后对于每个路径,按顺序用椭圆替换这些字符串的所有外观

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

    看起来确实需要对算法进行一些修补(例如,确保某个子字符串在所有字符串中都是第一个),然后需要在整个集合中调用它。。。我希望这至少能给你一个可能的方向。

    好吧,“自然数”的排序部分其实很简单,只要用有足够前导零的格式化数字替换所有数字,例如
    test9v
    ->
    test000009v
    test12b
    test000012b
    。这些现在可以通过标准方法进行排序

    对于实际大小。除非这实际上是一个庞大的系统,否则我只需添加手动省略号“列表”(regex的列表,为了灵活性和痛苦),将某些单词变成省略号。这确实需要持续的工作,但提出算法也会消耗你的时间;角落里有无数的箱子

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

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

    请注意:

    *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”


    |一个聪明而有趣的问题。