2017-01-30 2 views
0

У меня есть два массива, как это: [[word],[number of occurence] , ... ]Как сравнить две таблицы с помощью Ruby,

Table 1 : [[["web"], 9], [["paris"], 8], [["html5"], 6], [["css3"], 6] ... ] 
Table 2 : [[["web"], 2], [["paris"], 3], [["word"], 5], [["class"], 6] ... ] 

Я хочу сравнить таблицу 2 с настольными 1 и показывать только слова не на столе 2.

с примером Я бы получил:

Table 2 doesn't have html5, css3 

Есть ли у Ruby драгоценный камень, который может это сделать?

+4

Это очень странная структура использовать. Почему не Хэш с ключом/значением? – tadman

+1

Пожалуйста, прочитайте «[ask]». Ваш вопрос не задан. Вы просите рекомендации для драгоценного камня, который не соответствует теме. Вы также не показали нам доказательств усилий; Вы искали и не нашли ничего, что помогло? Если да, то где и почему это не помогло? Вы писали код? Если нет, то почему? Если это так, покажите нам минимальный код, демонстрирующий проблему, с которой вы сталкиваетесь. http://meta.stackoverflow.com/q/261592/128421 помогает объяснить. –

+0

@ tadman является правильным. Нечетная структура. Если хэш не используется, эти массивы можно, по крайней мере, упростить, например '[[" web ", 9], [" paris ", 8], [" html ", 6], [" css ", 6]. ..] '. Добавление сложности без какого-либо выигрыша не очень хорошо. –

ответ

4

Структура, используемая здесь довольно нерегулярно, но переотражениях к чему-то легче работать не трудно:

def hashify(list) 
    list.map do |(word), count| 
    [ word, count ] 
    end.to_h 
end 

|(word), count| декларация тянет слово из вложенного массива, это упрощает код.

Учитывая данные выборки работает следующим образом:

table1 = [[["web"], 9], [["paris"], 8], [["html5"], 6], [["css3"], 6] ] 
table2 = [[["web"], 2], [["paris"], 3], [["word"], 5], [["class"], 6] ] 

hashify(table1) 
# => {"web"=>9, "paris"=>8, "html5"=>6, "css3"=>6} 

Затем вы можете использовать это, чтобы вычислить разницу:

hashify(table1).keys - hashify(table2).keys 
# => ["html5", "css3"] 
+0

Я никогда не знал об использовании '| (word) |'. –

3

Нет необходимости в каких-либо драгоценных камнях. Array difference работает просто отлично, но вам нужно извлечь интересные слова первой:

table1 = [[["web"], 9], [["paris"], 8], [["html5"], 6], [["css3"], 6]] 
table2 = [[["web"], 2], [["paris"], 3], [["word"], 5], [["class"], 6]] 

def extract_words(table) 
    table.map{|sub_array| sub_array.flatten.first } 
end 

puts extract_words(table1) - extract_words(table2) 
# html5 
# css3 

С хэшей, было бы проще:

hash1 = {"web"=>9, "paris"=>8, "html5"=>6, "css3"=>6} 
hash2 = {"web"=>2, "paris"=>3, "word"=>5, "class"=>6} 

puts hash1.keys - hash2.keys 
# html5 
# css3 
1

я предполагаю, что вы не нужны числовые данные, поэтому я предложит однострочное решение вашей проблемы:

(table1.flatten - table2.flatten).reject {|elem| elem.is_a?(Integer)} 

Это возвращает следующий массив:

=> ["html5", "css3"] 
1
table1 = [[["web"], 9], [["paris"], 8], [["html5"], 6], [["css3"], 6] ] 
table2 = [[["web"], 2], [["paris"], 3], [["word"], 5], [["class"], 6] ] 

table1.flat_map(&:first) - table2.flat_map(&:first) 
# => ["html5", "css3"]