сравнить 2 содержимого массива в ruby - PullRequest
1 голос
/ 25 марта 2012

У меня есть 2 массива из 2 разных мест, но они содержат одинаковые элементы. Ниже показано, что у меня есть:

@var2 =  ["2/05/2008", "$1.5000", "$2.0000"]
         ["1/06/2007", "$1.4000", "$1.0000"] 

@var3 =  ["1/06/2007", "$1.4000", "$1.0000"]
         ["2/05/2008", "$1.5000", "$2.0000"]

И вот код, как я получаю эти массивы выше ... не хороший рубиновый код, я его признаю

 var1 = Nokogiri::HTML(open(file.htm))
 var1.xpath('//tr[position() > 1]').map do |row|
 @var2 = row.xpath('td').map(&:text)[0,3]
    puts @var2
 end

File.open('some.txt') do |file|
  file.each_line do |line|
    line1 = line.split(' ')
    line2 = line1[0]
    line3 = "$" + line1[1]
    line4 = "$" + line1[2]

    @var3 = line2.split(' ') + line3.split(' ') + line4.split(' ')
    puts @var3
  end
  file.close()
end

В обеих этих переменных у меня есть несколько таких строк. Как я могу сравнить @var2 и @var3? Также @var2 в порядке убывания даты. Есть ли способ сравнить значения / содержимое двух и получить результат? Это также означает, что с указанным выше форматом, если я изменю значение в одном из массивов, сравнение не будет выполнено, например:

@var2 =  ["2/05/2008", "$1.5000", "$2.0000"]
         ["1/06/2007", "$1.4000", "$1.0000"]

@var3 =  ["1/06/2007", "$1.4456", "$1.0000"]
         ["2/05/2008", "$1.5000", "$2.2222"]

Я пробовал несколько способов, но, к сожалению, это не сработало. Я думаю, что я должен зацикливаться на массивах и сравнивать, но не уверен, как это сделать.

Я пытался @var2 & @var3, @var2 - @var3. Кажется, они не работают, если я изменяю значение в одном из массивов. Сравнение по-прежнему проверяет индекс и говорит, что совпадения найдены. Мне нужно точное построчное сравнение со значениями в каждом массиве.

Также дополнительная информация: -

Я хочу знать, содержит ли массив точно такие же элементы, порядок не имеет значения.

В массивах var2 и var3 могут быть дубликаты. Размеры массива будут одинаковыми. не будет меньше элементов, ни NIL.

Ответы [ 4 ]

2 голосов
/ 25 марта 2012

Сортируйте массивы, прежде чем сравнивать их:

@var2.sort == @var3.sort

Если я что-то не упустил, в этом и заключается проблема.

1 голос
/ 25 марта 2012

Сравните их длину с длиной их пересечения :

@var2.length == @var3.length && @var2.length == (@var2 & @var3).length
0 голосов
/ 04 октября 2015

Использование оператора - класса Array

2.1.1 :006 > arr1 = [1,2,3,4]
=> [1, 2, 3, 4]
2.1.1 :007 > arr2 = [4,3,2,1]
=> [4, 3, 2, 1]
2.1.1 :008 > arr1-arr2
=> []
2.1.1 :009 > 

Итак, вы можете сделать это так

2.1.1 :001 > @var2 =  [["2/05/2008", "$1.5000", "$2.0000"],
2.1.1 :002 >              ["1/06/2007", "$1.4000", "$1.0000"] ]
 => [["2/05/2008", "$1.5000", "$2.0000"], ["1/06/2007", "$1.4000", "$1.0000"]] 
2.1.1 :003 > 
2.1.1 :004 >   @var3 =  [["1/06/2007", "$1.4000", "$1.0000"],
2.1.1 :005 >              ["2/05/2008", "$1.5000", "$2.0000"]]
 => [["1/06/2007", "$1.4000", "$1.0000"], ["2/05/2008", "$1.5000", "$2.0000"]] 
2.1.1 :006 > (@var2 - @var3) == []
 => true
2.1.1 :007 > 
0 голосов
/ 25 марта 2012

Как насчет

@var2.reverse == @var3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...