問題は、数字がnumbered
に追加された時点でコードに十分な情報がないことです。情報を最初に取得し、それを適用します。
まず、各項目は、その数が発生$unnumbered
$unnumbered
中で固有番号と指標の一つからなるリストであるリストを作成します。、それらの項目のそれぞれについて
lmap n [lsort -unique $unnumbered] {
list $n [lsearch -all $unnumbered $n]
}
# => {101 {0 1 2}} {102 {3 4}} {103 5} {104 6} {105 {7 8 9}} {106 10}
を分割アイテムをn
=数字に、indices
=インデックスにします。あなたが持っているインデックスの数を確認してください。複数のインデックスについては、次のように列挙された番号を追加します。
set i 0
foreach index $indices {
lappend numbered $n.[incr i]
}
を単一の指標については、単に数を追加:
lappend numbered $n
全体のプログラムは次のようになります。
set unnumbered [list 101 101 101 102 102 103 104 105 105 105 106]
set numbered [list]
foreach item [lmap n [lsort -unique $unnumbered] {
list $n [lsearch -all $unnumbered $n]
}] {
lassign $item n indices
if {[llength $indices] > 1} {
set i 0
foreach index $indices {
lappend numbered $n.[incr i]
}
} else {
lappend numbered $n
}
}
ドキュメント: > (operator), foreach, if, incr、 lappend、 lassign、 list、 llength、 lmap (for Tcl 8.5)、 lmap、 lsearch、 lsort、 set
あなたはlmap
を持っていない場合は、上記のリンクを参照してください。 lassign
がない場合は、代わりに
foreach {n indices} $item break
を使用してください。
ETA「シングルトンの数字には何の指標」の要件を緩和することができた場合は、1は、このようにそれを行うことができます:
set previous {}
lmap num $unnumbered {
if {$num ne $previous} {
set i 0
}
set previous $num
format %d.%d $num [incr i]
}
別の変形。Jerryの2番目の提案とよく似ていますが、これを提出するまでは私は見ませんでした。正直です。これは、$unnumbered
の要素が空の文字列でないことを前提としています。
set numbered [list]
set rest [lassign $unnumbered current next]
set i 0
while 1 {
if {$current eq $next} {
lappend numbered $current.[incr i]
} else {
if {$i > 0} {
lappend numbered $current.[incr i]
set i 0
} else {
lappend numbered $current
}
set current $next
}
if {$next eq {}} break
set rest [lassign $rest next]
}
良い解決策ですが、シングルトン番号をインデックスに残しておきたい場合は役に立ちません。 –
そう、その要件を逃した。 –