我正在寻找一个existign路径截断算法(类似于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个元素。
我正在寻找以前尝试过这个方向,如果这可以解决大量的代码或依赖性。
答案 0 :(得分:4)
我假设您主要询问如何处理从同一级别的层次结构中提取的文件夹名称集,因为按行和路径分隔符拆分并按层次结构深度聚合很简单。
你的问题让我想起了很多longest common substring problem,差异在于:
这些可能看起来很重要,但是如果你仔细检查文章中的动态编程解决方案,你可以看到它围绕创建一个“角色碰撞”表,然后在这个表中寻找最长的对角线。我认为您可以通过它们出现的顺序枚举表中的所有对角线,然后为每个路径按顺序替换这些带椭圆的字符串的所有外观。
强制使用2的最小子字符串长度将返回与您在问题中概述的结果类似的结果。
它似乎需要对算法进行一些修补(例如,确保某个子串在所有字符串中都是第一个),然后你需要在整个集合中调用它...我希望这至少能给你可能的方向。
答案 1 :(得分:0)
嗯,“自然数”排序部分实际上很简单,只需用格式化数字替换所有数字,其中有足够的前导零,例如。 Test 9V
- > Test 000009V
和Test 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是已经找到的最长公共子字符串。但是还有另一个问题(这里有{{1}) })
"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 Delta
或Alfa Beta
或Beta Beta
?
这有点漫无边际,但可能很有趣:)。