2011-03-04 238 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)" 
    } 
} 
相關問題