#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. Да, именно так. Ты прав.