按预定义列表中的值对TCL列表进行排序

按预定义列表中的值对TCL列表进行排序,tcl,Tcl,C#中实际上存在一个问题,因此希望有人能给我TCL解决方案 我有一个已经排序的列表。喂,我的排序列表是 {"Junior Developer" "Developer" "Senior Developer" "Project Lead"} 现在,我想按照与上面列表相同的顺序对上面列表的任何子集进行排序。也就是说,如果我有作为输入 {"Developer" "Junior Developer"} 我希望输出为 {"Junior Developer" "Developer"} 如果输入是 {"P

C#中实际上存在一个问题,因此希望有人能给我TCL解决方案

我有一个已经排序的列表。喂,我的排序列表是

{"Junior Developer" "Developer" "Senior Developer" "Project Lead"}
现在,我想按照与上面列表相同的顺序对上面列表的任何子集进行排序。也就是说,如果我有作为输入

{"Developer" "Junior Developer"}
我希望输出为

{"Junior Developer" "Developer"}
如果输入是

{"Project Lead" "Junior Developer" "Developer"}
然后我希望输出为

{"Junior Developer" "Developer" "Project Lead"}

我看到
lsort
有一个
-command
选项,但是我读了很多评论说它没有很好的性能,因此,我想知道是否有另一种方法可以使用
dict
来保留顺序。

您可以使用
lsearch
将索引放入排序列表,然后将其用作排序键:

set orderList {"Junior Developer" "Developer" "Senior Developer" "Project Lead"}
set original {"Developer" "Junior Developer"}

set keyed [lmap value $original {list $value [lsearch -exact $orderList $value]}]
set sortedKeyed [lsort -index 1 -integer $keyed]
set sorted [lmap value $sortedKeyed {lindex $value 0}]

puts "$original -> $sorted"
# "Developer" "Junior Developer" -> {Junior Developer} Developer
输出中不建议在值周围加双引号;它不是一种规范的列表引用样式(而且很难强制Tcl这样做;在执行用户可见的输出时,有一些邪恶的边缘情况通常并不重要)


您可以改为使用
-index
选项来
lsort
,以避免构建所有这些元组

set orderList {"Junior Developer" "Developer" "Senior Developer" "Project Lead"}
set original {"Developer" "Junior Developer"}

set indexes [lmap value $original {lsearch -exact $orderList $value}]
set sortedIndexes [lsort -indices -integer $indexes]
set sorted [lmap idx $sortedIndexes {lindex $original $idx}]

puts "$original -> $sorted"
# "Developer" "Junior Developer" -> {Junior Developer} Developer


您可以使用
foreach
而不是
lmap
,但代码要冗长得多。

亲爱的Donal,谢谢您的精彩回答。有几个问题:1。您对这两种方法都有偏好吗?2.你能解释一下为什么使用
lsearch-sorted
而不是
-exact
?我不明白这一点?3.这种方法是否比使用某种变化的
lsort-command
?Oops快得多。此处的
-排序
选项错误。(它执行二进制搜索,并暗示
-exact
)我希望可以加快初始映射(当在较长的列表上定义排序顺序时,有一些方法可以这样做),但这一次它只是碰巧起作用。更正。谢谢。现在更有意义了!