Вернуть индексы массива, где значения не идентичны - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть два массива A [] и B []. например A [сеть, HTTP, SMTP] и B [успех, успех, успех].

Состоит из всех имен услуг и имеет статус.

Для проверки на идентичные значения я использовал:

B.all? { |x| x == B[0] }

В качестве первого значения всегда будет успех.

Мне нужно проверить, все ли значения массива B идентичны, а если нет, то вернуть индексы там, где они не совпадают.

Мне нужно знать эффективный способ сделать это.

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Учитывая массив arr, я предполагаю, что цель состоит в том, чтобы вернуть наименьший индекс i > 0, для которого arr[i] != arr[i-1].

arr = [1, 1, 1, 3, 1, 4]

first = arr.first    
arr.index { |i| arr[i] != first }
  #=> 3

nil возвращается, если массив пуст или все элементы массива равны.

0 голосов
/ 07 ноября 2018

Учитывая массив ary = [1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 4, 4, 4], невозможно определить, какое целое число ведет, но вы можете найти индекс разрыва:

ary.each.with_index.with_object([]){ |(x, idx), o| o << idx + 1 if x != ary[idx + 1] }
#=> [3, 9, 10, 13]

Или это где первый элемент также рассматривается как разрыв:

ary.chunk_while { |a,b| a == b }.map(&:count).inject([0]) { |x, y| x + [x.last + y] }
#=> [0, 3, 9, 10, 13]
0 голосов
/ 06 ноября 2018

Как насчет:

my_array = [1, 1, 1, 3, 1, 4]
indexes = []
my_array.each_with_index do |item, index| indexes << index unless item == my_array[0] end

indexes # [3, 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...