问题描述
1 4 2 1 4
我想比较字符串中的每个字符。 我这样做是想知道列表是否已排序。
解决方法
我不太清楚您要实现的目标。通过“了解列表是否已排序”,并假设一个整数列表,您可以使用 tcl::mathop::<
或 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
}
}
请注意,发现差异后继续比较很少有用,因为最常见的差异是(相对于目标字符串)插入和删除;几乎一切之后都会有所不同。