Я использую программное обеспечение, которое не допускает дублирования значений для поля «Node_ID», узлы представляют собой набор объектов с несколькими полями (например, координата X, координата Y, высота).Я пытаюсь переименовать Node_Ids для всех узлов в новый формат, но изо всех сил пытаюсь добавить уникальный номер для любых обнаруженных дубликатов.
Основываясь на других прочитанных мной потоках, я попытался найти любые дубликатыиспользуя следующее:
array.include?(node)
duplicates = array.select{|element| array.count(element) > 1}
Я нахожусь в точке, где код, кажется, распознает дубликат и добавляет «_1» к дублирующему узлу, однако, если есть еще один дубликат, он также добавляет «_1»...
$array = Array.new # this is a temporary array I have been using to store the written Node_IDs, to check against for duplicates.
xy_nodes = ('_nodes').each do |xy|
x1 = xy.x.to_i
y1 = xy.y.to_i
x = x1.to_s.rjust(7, "0")
y = y1.to_s.rjust(7, "0")
node = x+y
# the above was just getting it to the correct format, no issues there
if $array.include?(node)
i=0
node = node + "_#{i+1}" # this is where things need sorted, clearly as it stands this would only result in _1 being added for the duplicates, however I'm struggling to iterate and check against duplicates after the first to continue adding _1, _2, _3 as suffixes.
$array << node
$checkmsg << node # this array is used later
xy.user_text = node # used for writing to as this field can accept duplicates
xy.write
else
puts "...iteration found no duplicates"
$array << node
xy.user_text = node
xy.write
end
puts "************ END OF ITERATION **************"
puts ""
end
Это приводит к чему-то похожему ниже (в поле "user_text"):
05555550333333
04444440222222
05555550333333_1
05555550333333_1
Просто интересно, как лучше получить код для оценки нового дубликата исосчитайте вверх для каждого найденного и получите:
05555550333333
04444440222222
05555550333333_1
05555550333333_2
Спасибо.
ОБНОВЛЕНИЕ: В ответ на ответы
У меня возникли проблемы с сжатием вИнформация к комментариям, поэтому я думал, что напишу здесь.Прежде всего, спасибо за ответ.Кажется, что все три метода работают хорошо, чтобы $ массив выглядел так, как я надеюсь, для готовой статьи Node_ID (или user_text во время тестирования).
Например, используя эти методы, я могуполучить вывод массива:
02511160678961
02735510688965
02966900697649
03216480682699
02735510688965_1
02735510688965_2
02735510688965_3
03355411149097
Тем не менее, массив $ в моем коде изначально использовался как нечто, в которое я бросал «узел», чтобы проверить, использовался ли он ранее.Вместо того, чтобы быть массивом, я хотел сам отформатировать / записать.
Каждый узел - это объект в таблице ('_nodes').И я надеюсь, что итеративно напишу новый user_text (Node_ID), проверяющий дубликаты каждой итерации, а не в конце завершенного массива.
Моя цель состояла в том, чтобы обновить user_text каждого объекта (в конце концов Node_ID когда-то был решен)и добавьте его в массив $ для проверки дубликатов, когда будет записан текст user_text следующего объекта.Не уверен, есть ли очевидный способ применить предложения к каждому объекту перед записью, а не к законченному массиву, как я справился с вашей помощью.
Также не уверен, что я полностью ясен -пожалуйста, спросите, если нет, и я могу редактировать свой первоначальный пост дальшеТакже счастлив отказаться от моего первоначального процесса мышления, если кажется, что это неправильный ход мысли.Еще раз спасибо.