2011-03-04 400 views
1

我新手,TCL,我写了下面的代码:比较TCL中两个列表的正确方法是什么?

set list1 {{1 2} 3 4} 
set list2 {{1 2} 8 1} 
if {[lindex $list1 0] == [lindex $list2 0]} { puts "They are equal!"} 

但是,当我打印子表元素我看到他们是平等的,但如果声明没有抓住它。为什么?我应该如何处理这个比较?

+2

请注意,使用'eq'来比较这些元素,而不是'=='(它实际上只是数字相等)。 – 2011-03-05 01:24:27

回答

1

如果我要实现一个lequal PROC,我想这个开始:

proc lequal {l1 l2} { 
    foreach elem $l1 { 
     if {$elem ni $l2} {return false} 
    } 
    foreach elem $l2 { 
     if {$elem ni $l1} {return false} 
    } 
    return true 
} 

,然后优化,以这样的:

proc K {a b} {return $a} 

proc lequal {l1 l2} { 
    if {[llength $l1] != [llength $l2]} { 
     return false 
    } 

    set l2 [lsort $l2] 

    foreach elem $l1 { 
     set idx [lsearch -exact -sorted $l2 $elem] 
     if {$idx == -1} { 
      return false 
     } else { 
      set l2 [lreplace [K $l2 [unset l2]] $idx $idx] 
     } 
    } 

    return [expr {[llength $l2] == 0}] 
} 
+0

为什么将这些比较为独立订单?这是一个很好的比较,但不是我称之为列表平等。你的版本就像说字符串相等应该匹配“team”==“mate” – 2012-05-07 06:22:08

1

它们并不相同,并且您正确地测试了它。当然你打印正确的变量?

编辑:行为对我来说。

# cat test.tcl 
set list1 {{1 2} 3 4} 
set list2 {{1 2} 8 1} 
if {[lindex $list1 0] == [lindex $list2 0]} { puts "They are equal!"} 
# tclsh test.tcl 
They are equal! 
# 
+0

对不起,这个例子不对:) :)!我打印我比较的内容,并看到它们是平等的。 – Narek 2011-03-04 14:57:41

+0

修改过的示例对我来说行为正确 – Erik 2011-03-04 15:12:37

6

我会做:

# from tcllib 
package require struct::list 


if {[::struct::list equal $list1 $list2]} { puts "Lists are equal"} 
1
#compare two lists with hash table 
if {[llength $list1] ne [llength $list2]} { 
    puts "number of list elements is different" 
} else { 
    puts "there are [llength $list1] list elements" 
} 
set i 1 
foreach a {$list1} b {$list2} { 
    set a($i) $a 
    set b($i) $b 
    incr i 
} 
for {set j 1} {$j <= [llength $list1]} {incr j} { 
    if { $a($j) ne $b($j) } { 
     puts "No Match $a($j) $b($j)" 
    } else { 
     puts "Match $a($j) $b($j)" 
    } 
}