编写可扩展Tcl代码对多组数据按值升序排序
问题需求
现有文件file1.txt,内容为多组两列数据,组间以空行分隔。需要编写可扩展的Tcl代码(允许使用哈希),将每组数据按数值升序排序后输出,要求支持数百组数据,不限每组条目数。
输入示例
AND 60 NAND 20 OR 30 SUN 90 SIN 10 SIM 80 EW 25 NEW 85 PHEW 55
期望输出
NAND 20 OR 30 AND 60 SIN 10 SIM 80 SUN 90 EW 25 PHEW 55 NEW 85
现有代码的问题
原代码存在两个核心错误:
- 用字典存储时,将所有组的键值对混存,丢失了原有的分组结构,导致所有条目被合并成一组处理。
- 排序逻辑是按字典键排序,而非需求要求的按数值列升序排序,排序依据完全错误。
修正后的Tcl代码
# 读取文件并按分组组织数据 proc readGroupsFromFile {filename} { set fileId [open $filename r] set data [read $fileId] close $fileId # 按空行分割成不同组 set groups [split $data "\n\n"] set groupList [list] foreach group $groups { set entries [list] # 分割组内的每一行 set lines [split $group "\n"] foreach line $lines { set line [string trim $line] if {$line eq ""} { continue } lassign [split $line] key value # 把每个条目存储为{数值 键},方便按数值排序 lappend entries [list $value $key] } # 非空组才加入列表 if {[llength $entries] > 0} { lappend groupList $entries } } return $groupList } # 对每组按数值升序排序并输出 proc sortAndPrintGroups {groupList} { set firstGroup 1 foreach group $groupList { # 按数值升序排序(-integer指定按整数比较) set sortedEntries [lsort -integer -index 0 $group] if {!$firstGroup} { puts "" ;# 组间输出空行分隔 } foreach entry $sortedEntries { lassign $entry value key puts "$key $value" } set firstGroup 0 } } # 执行逻辑 set filename "file1.txt" set groups [readGroupsFromFile $filename] sortAndPrintGroups $groups
代码说明
- 分组存储:用列表保存每个分组的条目,每个条目以
{数值 键}形式存储,既保留原分组结构,又便于后续按数值排序。 - 排序逻辑:通过
lsort -integer -index 0指定按整数类型比较条目第一个元素(数值),实现升序排序。 - 输出格式:处理组间空行,避免开头或结尾出现多余空行。
内容的提问来源于stack exchange,提问作者user2643899
相关产品推荐
相关产品推荐

