0

我有一种方法可以将数组中的所有项目向左移动一个位置。在我的后期条件下,我需要确保我的物品已经向左移动了一个。我已经将旧数组的第一个元素与新数组的最后一个元素进行了比较。我如何遍历从 2 到 count 的旧数组,从 1 到 count-1 循环遍历新数组并比较它们?这是我到目前为止的实现。

        items_shifted:
                    old array.deep_twin[1] ~ array[array.count]
                        and
                    across 2 |..| (old array.deep_twin.count) as i_twin all
                        across 1 |..| (array.count-1) as i_orig  all
                            i_twin.item ~ i_orig.item
                            end
                        end



    end

我希望结果是正确的,但我得到了指向这个后置条件的合同违规。我已经通过在方法之前和之后打印出数组来手动测试该方法,我得到了预期的结果。

4

1 回答 1

1

在失败的后置条件中,循环游标i_twin并分别i_orig迭代序列2 .. array.count1 .. array.count - 1,即它们的项目是索引2, 3, ...1, 2, ...。因此,循环执行比较2 ~ 13 ~ 2等(在运行时,它在第一个不等式处停止)。但是,您想比较元素,而不是索引。

一种可能的解决方案如下所示:

    items_shifted:
        across array as c all
            c.item =
                if c.target_index < array.upper then
                    (old array.twin) [c.target_index + 1]
                else
                    old array [array.lower]
                end
        end

循环检查所有元素是否已移动。如果光标指向最后一个元素,它将与旧的第一个元素进行比较。否则,它会测试当前元素是否等于下一个索引处的旧元素。

化妆品:

  1. 后置条件不假定数组从 1 开始,而是使用array.lowerand array.upper

  2. 后置条件不执行原始数组的深度孪生。这允许使用=而不是比较元素~

编辑:为了避免由优先规则引起的潜在混淆,并强调对旧数组和新数组之间的所有项目执行比较,Eric Bezault 建议的更好的变体如下所示:

    items_shifted:
        across array as c all
            c.item =(old array.twin)
                [if c.target_index < array.upper then
                    c.target_index + 1
                else
                    array.lower
                end]
        end
于 2019-09-28T18:46:18.457 回答