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

如何在Pine Script中按字符串所含数字对字符串数组排序

按字符串中的数字对字符串数组排序

我有一个字符串数组,每个字符串都包含一个数字。我尝试根据字符串中的数字从大到小对数组进行排序。目前我尝试过提取字符串中的数字,对数字数组排序后,遍历原数组匹配数字并放置对应字符串,但此方法未生效。请问该如何实现?

输入数组

"Ticker symbol |1|| " , "Ticker symbol |5|| " , "Ticker symbol |2|| "

期望输出

"Ticker symbol |1|| " , "Ticker symbol |2|| " , "Ticker symbol |5|| "

现有代码

//@version=5
indicator("sorting strings by number in string")


tickerstring1 = "Ticker symbol " + "|" + str.tostring(1) + "||"

tickerstring2 = "Ticker symbol " + "|" + str.tostring(5) + "||"

tickerstring3 = "Ticker symbol " + "|" + str.tostring(2) + "||"

string[] arrayofstrings = array.from(tickerstring1, tickerstring2, tickerstring3)


tickerstring1posstart = str.pos(tickerstring1, "|")
tickerstring1posend = str.pos(tickerstring1, "||")

tickerstring2posstart = str.pos(tickerstring1, "|")
tickerstring2posend = str.pos(tickerstring1, "||")

tickerstring3posstart = str.pos(tickerstring1, "|")
tickerstring3posend = str.pos(tickerstring1, "||")



numberfromstringtickerstring1 = str.substring(tickerstring1, tickerstring1posstart, tickerstring1posend)
numberfromstringtickerstring2 = str.substring(tickerstring2, tickerstring2posstart, tickerstring2posend)
numberfromstringtickerstring3 = str.substring(tickerstring3, tickerstring3posstart, tickerstring3posend)


string[] listofnumbersfromstrings = array.from(numberfromstringtickerstring1, numberfromstringtickerstring2, numberfromstringtickerstring3)


array.sort(listofnumbersfromstrings, order.descending)

listofnumbersfromstringstouseablearray = str.split(  str.tostring(listofnumbersfromstrings), ",")


finaluseablearraynumbers = str.split(  str.tostring(  listofnumbersfromstringstouseablearray   ), ",")


indicatorstring = "a"

for i = 0 to 2

    for a = 0 to 2

        if ( str.tostring(listofnumbersfromstringstouseablearray[i])  == str.tostring(finaluseablearraynumbers[a])  )
            indicatorstring := str.tostring(arrayofstrings[a])


//
labelname = label.new(bar_index,0,  ( indicatorstring )  , color=color.yellow, textcolor=color.black, style=label.style_label_down, size=size.large, yloc=yloc.price)


//
label.delete(labelname[1])

问题分析与解决方案

现有代码的问题

  • 提取数字逻辑错误:处理tickerstring2和tickerstring3的位置时,错误复用了tickerstring1的位置参数,导致所有字符串提取的都是同一个位置的内容。
  • 排序后处理冗余:将排序后的数字数组转字符串再拆分属于多余操作,直接使用原排序数组即可。
  • 匹配逻辑无效:嵌套循环仅最后一次匹配会覆盖indicatorstring,无法构建完整的排序后数组,最终只显示单个字符串。
  • 排序方向错误:期望输出是升序(1→2→5),但代码使用了order.descending降序排序,方向不符。

正确实现思路

利用Pine Script的array.sort()方法,配合自定义比较函数直接对原字符串数组排序。核心是从每个字符串中提取数字,通过数字大小决定排序顺序,无需额外拆分匹配。

完整代码

//@version=5
indicator("按字符串中的数字排序字符串数组")

// 构建原始字符串数组
tickerstring1 = "Ticker symbol |1||"
tickerstring2 = "Ticker symbol |5||"
tickerstring3 = "Ticker symbol |2||"
string[] arrayOfStrings = array.from(tickerstring1, tickerstring2, tickerstring3)

// 自定义比较函数:按字符串中的数字升序排序
f_sortByNumber(string a, string b) =>
    // 用正则提取|和||之间的数字
    numA = str.extract(a, "\\|(\\d+)\\|\\|")
    numB = str.extract(b, "\\|(\\d+)\\|\\|")
    // 转整数后比较,返回差值决定排序顺序
    int(numA) - int(numB)

// 对原数组应用自定义排序
array.sort(arrayOfStrings, f_sortByNumber)

// 拼接排序后的数组为显示字符串
resultStr = str.join(", ", arrayOfStrings)

// 在图表上展示结果
label.new(bar_index, high, resultStr, color=color.yellow, textcolor=color.black, style=label.style_label_down, size=size.large)
label.delete(label.new(bar_index, high)[1])

代码说明

  1. 正则提取数字:str.extract()配合正则\|(\d+)\|\|,精准定位字符串中的数字部分,无需手动计算位置,适配性更强。
  2. 自定义排序逻辑:比较函数提取两个字符串的数字并转为整数,返回差值控制排序:返回负数则a排在b前,实现升序;若需降序,改为int(numB) - int(numA)即可。
  3. 直接排序原数组:调用array.sort()传入自定义函数,直接对原字符串数组排序,省去额外的匹配步骤,逻辑简洁高效。
  4. 结果展示:用str.join()将排序后的数组拼接成字符串,通过标签显示在图表上。

内容的提问来源于stack exchange,提问作者Roboman Robo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:55:13