2013-01-09 72 views
0

我有兩個陣列數組操作,並將它們組

id_array :{2 1 1 2 3 1 2} 
type_array :{apple apple orange orange pineapple pineapple pineapple} 

我要處理的上述陣列和基於我想組以下的ID和類型,如下所示:

蘋果2 apple 1 orange 1 2 菠蘿3 菠蘿1 2

+1

請注意,Tcl使用不同的術語:數字索引數組稱爲「**列表**」;一個任意的字符串索引數組,一個哈希映射,被稱爲「**數組**」。 –

+1

我看到你問了同樣的問題措辭不同(http://stackoverflow.com/q/14241911/7552) - 請解釋算法來分組項目。爲什麼桔子是分組的,但蘋果不是? –

+0

桔子被分組,因爲它們按照升序排列,因爲它們按降序排列,所以不分組。也適用於菠蘿{3。菠蘿}沒有分組,但是最後一部分{{1,菠蘿},{2,菠蘿}}被分組。我希望我回答你的問題。 – user1863934

回答

0

這是非常平行於acheong87的答案,但我會用一本字典的數據結構

set types {apple apple orange orange pineapple pineapple pineapple} 
set ids {2 1 1 2 3 1 2} 

set groups [dict create] 
foreach id $ids type $types { 
    dict lappend groups $type [list $id $type] 
} 
puts $groups 
# apple {{2 apple} {1 apple}} orange {{1 orange} {2 orange}} pineapple {{3 pineapple} {1 pineapple} {2 pineapple}} 

set out [list] 
dict for {type sublist} $groups {lappend out $sublist} 
puts out 
# {{2 apple} {1 apple}} {{1 orange} {2 orange}} {{3 pineapple} {1 pineapple} {2 pineapple}} 

更新因要求說明:

set ids {2 1 1 2 3 1 2} 
set types {apple apple orange orange pineapple pineapple pineapple} 
set groups [list] 
set current_type "" 
set prev_id -1 
foreach id $ids type $types { 
    if {$type ne $current_type || $id < $prev_id} { 
     if {[info exists group]} {lappend groups $group} 
     set group [list] 
     set current_type $type 
    } 
    lappend group [list $id $type] 
    set prev_id $id 
} 
lappend groups $group 
puts [list $groups] 

相比,你問的這個輸出

{{{2 apple}} {{1 apple}} {{1 orange} {2 orange}} {{3 pineapple}} {{1 pineapple} {2 pineapple}}} 

注意額外的支撐。最終列表$groups是列表的列表。每個元素(或「子列表」)保持一致的結構。我們看到:

  • 與含有列表1個元素{2蘋果}的列表,
  • 與含有列表1個元素{1個蘋果}的列表,
  • 與含有列表{2個元素的列表1 orange}和列表{2 orange},
  • 一個包含列表{1 pineapple}的元素的列表,以及
  • 列出了包含列表{2菠蘿}和列表{2 pineapple} 。報告這個最終名單

一種方法是:

foreach sublist $groups { 
    foreach pair $sublist { 
     lassign $pair id type 
     puts "$id -> $type" 
    } 
} 

印刷

2 -> apple 
1 -> apple 
1 -> orange 
2 -> orange 
3 -> pineapple 
1 -> pineapple 
2 -> pineapple 

回答最後一個請求:給定上述最終名單:

set answer [list] 
foreach sublist $groups { 
    lappend answer [lindex $sublist 0 1] 
    foreach pair $sublist {lappend answer [lindex $pair 0]} 
} 
puts [join $answer] 

打印

apple 2 apple 1 orange 1 2 pineapple 3 pineapple 1 2 
+0

我在尋找以下最終輸出{{2,apple},{1,apple},{{1,orange},{2,orange}},{3,pineapple},{{ 1,pineapple},{2,pineapple}}在你的回答中無法得到答案 – user1863934

+0

不,因爲你沒有解釋如何創建組,直到我問。答案已更新。 –

+0

我不懂字典數據結構。我正在查看最終輸出結果{{2,apple},{1,apple},{{1,orange},{2,orange}},{3,pineapple},{{1,pineapple},{2,pineapple }}我怎麼能得到那個 – user1863934

0

歡迎來到Stack Overflow。通常,我們喜歡看到用戶嘗試解決他們自己的問題,因爲它有助於將注意力集中到特定的含糊或誤解,未來的訪問者可能會發現有用。然而,我們通常也願意提供幫助,無論如何:

Tcl有一個有趣的形式foreach,它允許我們同時迭代多個列表。

set id_array [list 2 1 1 2 3 1 2] 
set type_array [list apple apple orange orange pineapple pineapple pineapple] 
foreach id $id_array type $type_array { 
    lappend hash($type) [list $id $type] 
} 
foreach name [array names hash] { 
    lappend output $hash($name) 
} 
puts $output 

這種輸出,對我來說,

{{1 orange} {2 orange}} {{3 pineapple} {1 pineapple} {2 pineapple}} {{2 apple} {1 apple}} 
+0

謝謝acheong87。我想保持與原始問題中提到的相同的順序。我如何顯示輸出 – user1863934

相關問題