0

我有字符串输出:

1 4 2 1 4

我想让字符串中的每个字符进行比较。我这样做是想知道列表是否已排序。

4

2 回答 2

1

我不清楚你想要达到什么目的。通过“知道列表是否已排序”,并假设一个整数列表,您可以使用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选项按排序顺序返回每个列表元素的原始索引。通过检查这些索引是否按递增顺序,您可以知道原始列表是否已经排序。

当然,如果练习的目的是避免不必要的排序,那么这是没有用的。但是话又说回来,已经排序的列表的冒泡排序非常快,并且基本上会完全按照您的描述进行比较。因此,仅排序可能比首先通过脚本循环检查排序列表要快。

于 2021-04-19T09:16:04.367 回答
0

要获取字符串中的每个字符,请执行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
    }
}

请注意,在发现差异后继续比较很少有用,因为最常见的差异是(相对于目标字符串)插入和删除;其中任何一个之后的几乎所有内容都会有所不同。

于 2021-04-19T08:32:15.873 回答