You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写可扩展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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:13:32