我有字符串输出:
1 4 2 1 4
我想让字符串中的每个字符进行比较。我这样做是想知道列表是否已排序。
我不清楚你想要达到什么目的。通过“知道列表是否已排序”,并假设一个整数列表,您可以使用tcl::mathop::<
or tcl::mathop::<=
,具体取决于您是否要允许重复值:
if {[tcl::mathop::<= {*}$list]} {
puts "List is sorted"
} else {
puts "List is mixed up"
}
这也适用于字符串的 ASCII 比较。对于更复杂的比较,例如使用字典规则或不区分大小写,将其与选项结合起来可能是最简单lsort
的-indices
:
tcl::mathop::< {*}[lsort -indices -dictionary $list]
该-indices
选项按排序顺序返回每个列表元素的原始索引。通过检查这些索引是否按递增顺序,您可以知道原始列表是否已经排序。
当然,如果练习的目的是避免不必要的排序,那么这是没有用的。但是话又说回来,已经排序的列表的冒泡排序非常快,并且基本上会完全按照您的描述进行比较。因此,仅排序可能比首先通过脚本循环检查排序列表要快。
要获取字符串中的每个字符,请执行split $the_string ""
(是的,在空字符串上)。这为您提供了字符串中所有字符的列表;你可以用它foreach
来迭代它们。请记住,您可以一次迭代两个(或更多)列表:
foreach c1 [split $the_string ""] c2 $target_comparison_list {
if {$c1 ne $c2} {
puts "The first not equal character is “$c1” when “$c2” was expected"
break
}
}
请注意,在发现差异后继续比较很少有用,因为最常见的差异是(相对于目标字符串)插入和删除;其中任何一个之后的几乎所有内容都会有所不同。