如何在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])
代码说明
- 正则提取数字:
str.extract()配合正则\|(\d+)\|\|,精准定位字符串中的数字部分,无需手动计算位置,适配性更强。 - 自定义排序逻辑:比较函数提取两个字符串的数字并转为整数,返回差值控制排序:返回负数则
a排在b前,实现升序;若需降序,改为int(numB) - int(numA)即可。 - 直接排序原数组:调用
array.sort()传入自定义函数,直接对原字符串数组排序,省去额外的匹配步骤,逻辑简洁高效。 - 结果展示:用
str.join()将排序后的数组拼接成字符串,通过标签显示在图表上。
内容的提问来源于stack exchange,提问作者Roboman Robo
相关产品推荐
相关产品推荐

