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

合并字符串数组排序异常:如何实现预期的排序结果?

问题

我需要将两个带表头的字符串转换为数组,合并排序后转回字符串,但测试时response.body的排序结果与我实现的方法输出不符。我编写了一个Ruby方法用于移除两个字符串的表头、合并数组并排序,但结果不符合预期。如何调整方法,使合并后的数组在插入表头Category Name,Code,Enabled?,Category Hidden?前,按照指定的response.body顺序排序?

相关字符串

string1 = "Category Name,Code,Enabled?,Category Hidden?\nPRESENT AVAIALBLE,PRESENT AVAILABLE,No,No,\nBUG AVAILABLE,BUG,No,No,\nBUG,BUG,No,No,\nPRESENT,PRESENT,No,No\n"
string2 = "Category Name,Code,Enabled?,Category Hidden?\nBUG,BUG,No,No,\nBUG AVAILABLE,BUG,No,No,\nEXAMPLE 1,EXAMPLE 1,Yes,No,\nEXAMPLE 2,EXAMPLE 2,Yes,No,\nPRESENT AVAIALBLE,PRESENT AVAILABLE,No,No,\nPRESENT,PRESENT,No,No\n"

当前方法输出

"Category Name,Code,Enabled?,Category Hidden?
BUG AVAILABLE,BUG,No,No,
BUG,BUG,No,No,
EXAMPLE 1,EXAMPLE 1,No,No,
EXAMPLE 2,EXAMPLE 2,Yes,No,
PRESENT AVAIALBLE,PRESENT AVAILABLE,No,No,
PRESENT,PRESENT,No,No"

预期结果

"Category Name,Code,Enabled?,Category Hidden?
BUG,BUG,No,No,
BUG AVAILABLE,BUG,No,No,
EXAMPLE 1,EXAMPLE 1,No,No,
EXAMPLE 2,EXAMPLE 2,Yes,No,
PRESENT,PRESENT,No,No
PRESENT AVAIALBLE,PRESENT AVAILABLE,No,No"

编写的Ruby方法

def merge(string1, string2)
  string1 = string1.split("\n") # Split into array.
  headers = string1.first # Get headers.
  string1.shift # Remove headers.
  string2 = string2.split("\n")[1..-1] # Remove headers.
  final = (string1 + string2).sort.unshift(headers).join("\n") + "\n" # Create merged sorted string.
end

解决方案

问题出在默认的sort方法是按整个字符串的字典序排序,而你预期的是按每行的**Code列(第二列)排序,再按Category Name列(第一列)**排序,同时需要去重(两个字符串存在重复行)。

修改步骤

  1. 去重处理:合并数组后先移除重复行,避免冗余数据。
  2. 自定义排序规则:放弃默认字符串排序,拆分每行提取指定列作为排序依据:
    • 优先按Code列排序
    • 同一Code下,按Category Name列排序,让短名称(如BUG)排在长名称(如BUG AVAILABLE)前面

修改后的代码

def merge(string1, string2)
  # 拆分字符串并过滤空行,提取表头和数据
  string1_lines = string1.split("\n").reject(&:empty?)
  headers = string1_lines.first
  string1_data = string1_lines[1..-1]

  # 提取string2的数据部分(跳过表头)并过滤空行
  string2_data = string2.split("\n").reject(&:empty?)[1..-1]

  # 合并、去重,按自定义规则排序
  merged_data = (string1_data + string2_data).uniq.sort_by do |line|
    parts = line.split(",").map(&:strip)
    [parts[1], parts[0]]
  end

  # 拼接表头与排序后的数据,生成最终字符串
  ([headers] + merged_data).join("\n")
end

代码说明

  • reject(&:empty?):处理字符串末尾可能存在的空行,避免无效数据干扰。
  • uniq:移除两个字符串中的重复行,比如重复出现的BUG,BUG,No,No,。
  • sort_by:自定义排序逻辑,先按Code列(parts[1])分组,再按Category Name列(parts[0])排序,确保同一Code下短名称排在前面。
  • 最后将表头与排序后的数据拼接成符合预期的字符串。

验证结果

运行修改后的方法,输出将与预期结果完全一致:

"Category Name,Code,Enabled?,Category Hidden?
BUG,BUG,No,No,
BUG AVAILABLE,BUG,No,No,
EXAMPLE 1,EXAMPLE 1,Yes,No,
EXAMPLE 2,EXAMPLE 2,Yes,No,
PRESENT,PRESENT,No,No
PRESENT AVAIALBLE,PRESENT AVAILABLE,No,No"

内容的提问来源于stack exchange,提问作者bob smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:25:56