2013-07-11 131 views
1

我有一個數組完成的過程。爲了返回它,我使用「數組獲取」來檢索列表。此列表然而,這並不只包含我的數組entrys,而且他們的指標:使用數組獲取後,如何刪除TCL中的索引

所以我的陣列[ a b c d ]變成一個列表{ 0 a 1 b 2 c 3 d }

我怎樣才能擺脫這些索引編號,而不會干擾列表的順序?

+2

只是一個(遲來的)想法。爲什麼?如果你想要一個列表,爲什麼不讓'proc'生成一個列表? – nurdglaw

+1

數組沒有順序,您不能保證獲得該列表。使用字典和「字典值」。 – potrzebie

+0

一般來說,如果您想要將對象傳遞給/來自特定代碼或想要執行諸如獲取值集合(即,如potrzebie寫入,字典值)那樣,我推薦使用字典。它只是簡化了生活,字典語法仍然非常直觀且易於使用。 –

回答

1

我覺得這是使用foreach循環的最簡單和最基本的方法:

% set list {0 a 1 b 2 c 3 d} 
% set entrylist {} 
% foreach {id entry} $list { 
%  lappend entrylist $entry 
% } 
% puts $entrylist 
a b c d 
+0

好主意!謝謝 – Lumpi

5

有幾個選項,除了使用foreach

# [array get] actually returns a dictionary 
puts [dict values $list] 
# Could do this too 
set entrylist {} 
dict for {- entry} $list { 
    lappend entrylist $entry 
} 
puts $entrylist 

有Tcl 8.6更多的可能性:

puts [lmap {- entry} $list {set entry}] 

(還有一個dict map,但在這裏是沒有用的。)

我喜歡dict values ...

+0

是否還有一種方法來保持數組的元素順序?爲什麼「對的順序是未定義的......」Cheers ... – Lumpi

+0

對「未定義」的順序。這就是Tcl的工作方式。如果你感到困擾,你可以使用其中一種機制,它涉及循環來自'數組名稱'的返回,但是首先對它進行排序。 'dict'值被定義爲按照添加到字典的順序返回數據。老實說,正如我上面所建議的那樣,如果你有選擇的話,使用數組_就不行了。 – nurdglaw

+0

我想念C++ ....謝謝你的幫助。 – Lumpi

0

如果你已經有一個數組和工作,Tcl的8.5或更高版本,使用dict values

set arr(0) a 
set arr(1) b 
set arr(2) c 
set arr(3) d 

puts [dict values [array get arr]] 

但最好是使用一個簡單的list

set mylist {a b c d} 
lset list 1 boo 
puts [lindex $mylist 1] 
lappend mylist eff 

數組是關聯的。總是。

相關問題