найти дубликаты на странице XML - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь найти дубликаты в XML, возвращенные вызовом веб-службы, используя ruby ​​и nokogiri.

Вывод, который я получаю из приведенного ниже кода, выглядит примерно так:

found duplicate["1", "1"]
found duplicate["1", "1"]
found duplicate["1", "1"]
found duplicate["1", "1"]
found duplicate["2", "2"]

Что я хочу знать, так это то, что skus 1 и 2 были дублированыИтак, что-то вроде этого "найден дубликат skus [Duplicated skus]".

xml выглядит так:

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Вот более эффективный способ поиска дубликатов в массиве (использование #count замедляет работу алгоритма, поскольку ему приходится обходить весь массив для каждого элемента, O (N ^ 2)):

list_of_item_ids.group_by { |e| e }.select { |k,v| v.size > 1 }.map(&:first)
2 голосов
/ 03 февраля 2012
downloaded_from_url = "<Root><Context><ID>1234</ID><Item><ID>4567</ID></Item><Item><ID>4567</ID></Item><Item><ID>5678</ID></Item><Item><ID>5678</ID></Item>"
parsed_xml_document = Nokogiri::XML(downloaded_from_url)

list_of_item_ids    = parsed_xml_document.xpath("//Item/ID").map { |x| x.text }

def find_duplicate_items( in_collection=[] )
  in_collection.select do |item|
    in_collection.count(item) > 1
  end.uniq
end

duplicate_item_ids  = find_duplicate_items( list_of_item_ids )
#=> ["4567", "5678"]

Более быстрый способ найти дубликаты (Авторы: Райан ЛеКомпт). Немного измененная и более короткая версия.

def fast_find_duplicate_items ( in_collection=[] )
  collection.group_by do |element|
    element
  end.select do |key, value|
    value.size > 1
  end.keys
end
...