20.8. Как в QSP сравнить два массива?
В: Как в QSP сравнить два массива?
О: На первый взгляд вопрос кажется довольно простым, однако сравнение сравнению рознь. И если мы зададим вопрос: как именно мы хотим сравнить два массива? — возникают совершенно разные решения для различных вариантов сравнения.
Мы можем сравнить массивы по числу элементов:
if arrsize('mass_1') = arrsize('mass_2'):
*pl 'Число элементов в массивах одинаковое.'
else
*pl 'Число элементов в массивах разное.'
end
Довольно простая задача.
Возьмём задачу посложнее: проверить массивы на идентичность. То есть значение каждого элемента одного массива должно совпадать со значением элемента другого массива под тем же индексом:
loop local i, size = 0, arrsize('mass_1') while i < size and $text = '' step i += 1:
if mass_1[i] <> mass_2[i]:
$text = 'Массивы не идентичны'
end
end
if $text = '': $text = 'Массивы идентичны'
Само собой проверять на идентичность массивы разного размера нет смысла.
Третья задача ещё сложнее. Нужно проверить, присутствуют ли в массивах одни и те же значения, но при этом не важно, совпадают ли индексы элементов с этими значениями.
Кажется, что она решается относительно просто:
loop local i,size = 0,arrsize('mass_1') while i < size and $text = '' step i += 1:
if arrpos('mass_2', mass_1[i]) = -1:
$text = 'Массивы разнятся по содержимому'
end
end
if $text = '': $text = 'Массивы состоят из одинаковых элементов'
Это решение может сработать, если в массивах, например, вот такое содержимое:
mass_1[0] = 1 & mass_2[0] = 4
mass_1[1] = 2 & mass_2[1] = 3
mass_1[2] = 3 & mass_2[2] = 2
mass_1[3] = 4 & mass_2[3] = 1
Но как быт ь, если в массивах вот такое содержимое
mass_1[0] = 1 & mass_2[0] = 4
mass_1[1] = 1 & mass_2[1] = 4
mass_1[2] = 1 & mass_2[2] = 1
mass_1[3] = 4 & mass_2[3] = 1
Да, в них содержатся одинаковые значения, но встречаются они разное количество раз. А если при сравнении нам нужно учесть и количество?
Задача становится чуть более сложной. И теперь её решение будет включать в себя несколько этапов:
- Сравнение массивов по размеру. Если размеры разные, то массивы в любом случае не равны.
- Копирование массивов во временные.
- Сортировка значений во временных массивах
- Сравнение временных массивов на идентичность
Сортировка значений в массивах — это отдельный вопрос, и он представлен в смежном разделе Сортировка данных.
Готовое решение для сравнения массивов на идентичность, на подобие (значения одинаковы но расположены в разном порядке), на совпадение хотя бы одного элемента есть в библиотеке easy.math.3, см. функцию em.arr.simpl.