我需要解析字符串才能从列表中获得值。假设我有三个列表,L-效用,g-效用,grp-效用。这些列表中的每一个都包含代理的本地、全局和组级别属性的值。我希望用户输入效用随时间变化的公式,例如更改方程可以是L1 + L3*L4/G3。为了计算这个字符串,L1应该是l-实用程序的第1项,L3是l-实用程序的第3项,G3是g-实用程序列表的第3项。请指导我如何做这件事。解析此字符串后,我可以使用result进行计算。
发布于 2017-07-26 15:23:13
这是一个棘手的问题,这里有一种方法应该有效,但相当不灵活。最重要的是,它依赖于字符串空格(“")来解析字符串输入中的不同单元,因此您的输入格式必须是"L1 + G2 + GRP3"- -您不能在字母和数字之间缺少空格或额外的空格。
globals [ L-utility G-utility GRP-utility calc-val ]
to setup
ca
reset-ticks
set L-utility [ 1 2 3 4 5]
set G-utility [ 40 50 60 70 80 ]
set GRP-utility [ 777 889 999 1111 2222 ]
end
to splitstring-calc
let tokens.list []
let to.parse string-input
let built.string ""
let full.len length to.parse
let shortened length remove " " to.parse
let space.count full.len - shortened
let token.count ( space.count + 1 )
let items.list ( range 0 token.count )
let substart 0
let subend position " " string-input
foreach ( range 0 token.count ) [
i ->
ifelse position " " to.parse != false [
set subend position " " to.parse
]
[
set subend length to.parse
]
let cur.token substring to.parse substart subend
set tokens.list lput ( remove " " cur.token ) tokens.list
set to.parse substring to.parse ( subend ) ( length to.parse )
if length to.parse > 0 and item 0 to.parse = " " [
set to.parse remove-item 0 to.parse
]
]
foreach tokens.list [
i ->
ifelse member? i "+ - / * ( ) " [
set built.string ( word built.string " " i " " )
]
[
let l.name substring i 0 (length i - 1)
let l.num last i
set built.string ( word built.string " item " l.num " " l.name "-utility " )
]
]
set built.string remove-item 0 built.string
print built.string
set calc-val run-result built.string
end然后,您可以使用"string“类型的输入框来编写您的公式,它应该可以工作:




注意,如果您想要添加比我更多的操作符,应该可以将它们添加到"+ - / * ( )"字符串中。
https://stackoverflow.com/questions/45327325
复制相似问题