从 Tcl 中的 string2 中删除 string1 的重复元素

Remove duplicate elements of string1 from string2 in Tcl

我想从字符串 2 中删除 string1 的重复元素,然后输出新的字符串。我的代码仅在重复元素按顺序排列时才有效。 我想按任何顺序处理它。请指教

当前代码:

set str1  "a 1 b 2 c 3 X Y Z"
set str2  "a 1 b 2 c 3 P Q R"
set results {}


set results [lmap a_elem $str1 b_elem $str2 {
    if {$a_elem != $b_elem} {string cat $b_elem} else continue      
}]   

puts $results    

以下代码的输出: P Q R

但是,如果

set str1 "a 1 b 2 c 3 X Y Z"
set str2 "P a 2 1 R c Q 3 b"

然后输出将是:P a 2 1 R c Q 3 b

基本与str2相同,没有重复删除。

如果要输出str2中的列表str1中没有的元素,首先要建立一个元素字典str1 以便您可以使用高效的查找(字典是内部哈希表)。 强烈 建议您为此使用一个过程,因为它使实施更加有效。

proc removeItems {str1 str2} {
    foreach item $str1 {
        dict set items $item ""; # Value unimportant
    }
    lmap item $str2 {
        if {[dict exists $items $item]} continue
        string cat $item
    }
}

puts [removeItems "a 1 b 2 c 3 X Y Z"  "P a 2 1 R c Q 3 b"]
# P R Q

代码自然假设 str2 的顺序很重要。

如果性能不重要,可以直接使用:

set results [lmap elem $str2 {
    if {$elem ni $str1} {string cat $elem} else continue
}]