Я не смог найти способ сравнить две строки без учета регистра. Как я мог сделать это в netlogo?
Мне не удалось найти специальный примитив, чтобы сделать это, или даже примитив to-upper
, который упростил бы это. Для этого вы можете сделать грубую служебную процедуру:
to-report equal-ignore-case? [ str1 str2 ]
if (length str1 != length str2) [ report false ]
foreach (range length str1) [ i ->
let c1 (item i str1)
let c2 (item i str2)
; if c1 = c2, no need to do the `to-upper-char` stuff
if (c1 != c2 and to-upper-char c1 != to-upper-char c2) [
report false
]
]
report true
end
; this only works with a string length 1
to-report to-upper-char [ c ]
let lower "abcdefghijklmnopqrstuvwxyz"
let upper "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
let pos (position c lower)
report ifelse-value (is-number? pos) [ item pos upper ] [ c ]
end
Тогда просто для сравнения equal-ignore-case? "hello" "HELLO"
.
Очевидно, это не сработает, если вам важны персонажи с акцентами и тому подобное. Я также не даю никаких гарантий по производительности.
Существует расширение
string
для NetLogo (github.com/NetLogo/String-Extension) с репортерамиupper-case
иlower-case
, но на момент написания этого комментария это расширение не обновлялось годами.