2016-03-14 3 views
0

Если List1 является:TCL: сортировка списка в зависимости от массива

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 

И array1 является:

{3 4 5} {12 13} {20 21} 

Как преобразовать list1 согласно array1, заменив обратный список каждого элемента array1, т.е. производство этого :

1 2 5 4 3 6 7 8 9 10 11 13 12 14 15 16 17 18 19 21 20 22 23 24 25 
^^^^^    ^^^^^     ^^^^^ 

ответ

2

Это не задача сортировки, это поиск задачи.

Если предположить, что диапазоны для обратных не пересекаются, но не обязательно присутствуют либо (т.е. не используя тот факт, что они являются смежным номером), вы получите что-то вроде этого:

# Iterate over each of the replacement patterns 
foreach range $array1 { 
    # Iterate over each of the locations where the first element of the current 
    # replacement pattern is found 
    foreach pos [lsearch -all -exact $list1 [lindex $range 0]] { 
     # This will be the index of the *last* element in each subrange 
     set pos2 [expr {$pos + [llength $range] - 1}] 

     # Do the reversed replacement if the ranges match 
     if {[lrange $list1 $pos $pos2] eq $range} { 
      set list1 [lreplace $list1 $pos $pos2 {*}[lreverse $range]] 
     } 
    } 
} 

Результат после этого будет в обновленlist1 переменная. Завершение процедуры в качестве упражнения.

Смежные вопросы