интеллектуальное усечение/замещающий знак пути для дисплея

Я ищу существующий алгоритм усечения пути (подобный тому, с чем делает статический элемент управления 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/

(Предполагающий, что замещающий знак обычно короче, чем три буквы).

Это - просто пример довольно простого, идеального случая (например, они все закончили бы в различных длинах теперь, и я не буду знать, как создать хорошее предложение, когда путь "Тест Штуки / Длинный Тест /" добавляется к пулу).

Нет никакой данной структуры элементов пути, им присваивает пользователь, но часто объекты будут иметь подобные сегменты. Это должно работать на пропорциональные шрифты, таким образом, алгоритм должен взять функцию меры (и не назвать ее к в большой степени), или генерируйте список предложения.

Мудрый данными, типичный вариант использования содержал бы 2.. 4 сегмента контура anf 20 элементов на сегмент.

Я ищу предыдущие попытки в то направление, и если это разрешимо с разумным объемом кода или зависимостями.

9
задан peterchen 4 November 2009 в 00:49
поделиться

2 ответа

Я предполагаю, что вы спрашиваете в основном о том, как разобраться с набором имен папок, извлеченные с того же уровня иерархии, поскольку расщепление со стороны рядов и сепараторов пути и агрегация по глубине иерархии просто.

Ваша проблема напоминает мне много самой длинной общей задачи подстроки , с различиями, которые:

  1. вы заинтересованы во многих подстрадающих, а не только один.
  2. Вы заботитесь о порядке.

Это может оказаться существенными, но если вы изучите решение динамического программирования в статье, вы можете видеть, что он вращается вокруг создания таблицы «столкновения персонажей», а затем ищет самую длинную диагональ в этой таблице. Я думаю, что вы могли бы вместо этого перечислить все диагонали в таблице при заказе, в котором они появляются, а затем для каждого пути заменить порядок, все появления этих строк с эллипсами.

Обеспечение минимальной длины подстроки от 2 вернет результат, аналогичный тому, что вы изложены в вашем вопросе.

Кажется, что он требует некоторого звонков с алгоритмом (например, обеспечение определенной подстроки сначала во всех строках), а затем вам нужно вызовать его по всему набору ... Я надеюсь, что это, по крайней мере, дает вам возможное направление.

4
ответ дан 3 November 2019 в 07:48
поделиться

Ну, упорядочить «натуральное число» на самом деле просто: просто замените все числа форматированными числами с достаточным количеством начальных нулей, например. Тест 9В -> Тест 000009V и Тест 12B -> Тест 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 Delta или Alfa Beta или Beta Beta или Beta ?

Это немного бессвязно, но может быть развлекательный :).

0
ответ дан 3 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: