Ruby — Перебор каждой строки внутри массива и удаление повторяющихся символов

#arrays #ruby #string #duplicates #iteration

Вопрос:

Мне нужно удалить каждый дубликат из каждой строки по отдельности, но не из всего массива. В основном то, что я ищу, — это a .uniq для каждой строки внутри массива, но не для массива в целом.

Пример:

 array = ["abc", "abc", "xxzzyyww", "aaaaa"]
 

Ожидаемый результат:

 ["abc", "abc", "xzyw", "a"]
 

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

 ["abc", "ab", "xxzzyyww", "aaaaa"]
 

Комментарии:

1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

2. Ваш пример заставляет читателей думать, что вы заинтересованы в устранении двух одинаковых символов подряд. Если вы хотите, скажем, "aaba" быть преобразованным в "ab" вас, вам следует использовать другой пример. В любом случае вам необходимо отредактировать, чтобы уточнить свой вопрос.

3. @Кэри Свовленд Вопрос довольно ясен, когда он говорит «уникальный», что также включает в себя ваш приведенный пример.

Ответ №1:

Как насчет использования string#squeeze (https://apidock.com/ruby/String/squeeze)

 array = ["abc", "abc", "xxzzyyww", "aaaaa"]
# => ["abc", "abc", "xxzzyyww", "aaaaa"]

array.map {|x| x.squeeze }
# => ["abc", "abc", "xzyw", "a"]
 

Комментарии:

1. Или просто: array.map(amp;:squeeze)

2. Спасибо, по большей части это работало, но в одной из ситуаций у меня был массив строк, которые выглядели так: 'qzbw qez xgedfibnyuhqsrazlwtpocj fxgpoqijdzybletckwaunsr' 'pwnqsizrfcbyljexgouatd ljtperqsodghnufiycxwabzw' И по какой-то причине он не избавился от каждого дубликата… Не мог понять, почему, тхо. Но замена .squeeze на .chars.uniq сделала свое дело.

Ответ №2:

Ввод

 array = ["abc", "abc", "xxzzyyww", "aaaaa"]
 

Код

 p array.map { _1.chars.uniq.join }
 

Выход

 ["abc", "abc", "xzyw", "a"]
 

Комментарии:

1. Спасибо! Это работало для каждой отдельной строки в каждом массиве. Кстати, каково использование этого _1 здесь? Это просто другой способ сказать |x| x. ?

2. Да, именно так. Ты прав.