Как использовать поперечный цикл в пост-состоянии для сравнения старого массива и нового массива по определенным показателям? - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть метод, который сдвигает все элементы в массиве влево на одну позицию.В моем посте я должен убедиться, что мои предметы смещены влево на единицу.Я уже сравнил первый элемент старого массива с последним элементом нового массива.Как пройти через старый массив от 2 до счетчика, пройти через новый массив от 1 до счетчика-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

Я ожидал, что результат будет верным, но вместо этого я получаю нарушение контракта, указывающее на это условие публикации.Я проверил метод вручную, распечатав массив до и после метода, и получил ожидаемый результат.

1 Ответ

1 голос
/ 28 сентября 2019

В постусловии, которое не выполняется, курсоры цикла i_twin и i_orig выполняют итерации по последовательностям 2 .. array.count и 1 .. array.count - 1 соответственно, т.е. их элементами являются индексы 2, 3, ... и 1, 2, ....Итак, цикл выполняет сравнения 2 ~ 1, 3 ~ 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.lower и array.upper.

  2. Постусловие не выполняет глубокую двойку исходного массива.Это позволяет сравнивать элементы, используя =, а не ~.

Редактировать: Чтобы избежать возможной путаницы, вызванной правилами приоритета, и подчеркнуть, что сравнениевыполненный для всех элементов между старым и новым массивом, лучший вариант, предложенный Эриком Безо, выглядит так:

    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
...