2016-05-31 70 views

回答

0

我将把图像1作为表1和图像2作为表2.

在表2中的一行由水平,1类,2类,...,X类 。我们可以看到,你需要为每个类别一栏,所以你要在这里做的第一件事就是从表中获取的一组类别的1

require 'set' 

# A set of all the categories extracted from table 1 
categories = Set.new 

table1 = [ 
    { title: 'Item 1', level: 1, category: 'Category 1' }, 
    { title: 'Item 2', level: 1, category: 'Category 2' }, 
    ... 
] 

# Extract categories from table 1 
table1.each do |item| 
    categories << item[:category] # add category to set 
end 

,我们可以在这里看到的下一件事是,在表2项目按其级别和类别排列。我们需要一种方式来说“给我的项目(不止一种可能)在X级与Y类”。因此,表2可以表示类似如下:

table2 = { 
    level1: { category1: [...], category2: [...], category3: [...] }, 
    level2: { category1: [...], category2: [...], category3: [...] }, 
} 

举个例子,这样,你会使用

table2[:level1][:category2] 

下一个任务是从表转换得到(1级,2类)项目1到表2.考虑到表2的上述表示,这很简单,并且可以通过遍历表1并将该项(或者其标题)添加到table2散列的适当的级别和类别数组中来完成。

# Arrange items by level and category 
table1.each do |item| 
    table2[item[:level]] ||= {} # hash of categories for this item's level 
    table2[item[:level]][item[:category]] ||= [] # array of items for this item's level and category 
    table2[item[:level]][item[:category]] << item[:title] # add item to its corresponding array 
end 

...你现在有你想要的表示你的数据。

表2中要注意的一件事是(级别1,类别1)有两个项目,并使用两个单独的行来表示这一点。如果你想这样输出,那么你需要遍历每个级别,并为每个级别遍历每个类别,在每个项目在(级别,类别)打印一行。你可以看到如何做到这一点在下面的完整的源代码的例子(你是免费的,如果你想使用):

require 'set' 

table1 = [ 
    { title: 'Item 1', level: 1, category: 'Category 1' }, 
    { title: 'Item 2', level: 1, category: 'Category 2' }, 
    { title: 'Item 3', level: 2, category: 'Category 3' }, 
    { title: 'Item 5', level: 3, category: 'Category 3' }, 
    { title: 'Item 6', level: 1, category: 'Category 1' }, 
    { title: 'Item 7', level: 2, category: 'Category 2' }, 
    { title: 'Item 8', level: 4, category: 'Category 1' }, 
    { title: 'Item 9', level: 4, category: 'Category 3' } 
] 

table2 = { 
    # 1: { category1: [...], category2: [...], category3: [...] }, 
    # 2: { category1: [...], category2: [...], category3: [...] }, 
} 

# A set of all the categories extracted from table 1 
categories = Set.new 

# Extract categories and also arrange items by level and category 
table1.each do |item| 
    categories << item[:category] # add category to set 

    table2[item[:level]] ||= {} # hash of categories for this item's level 
    table2[item[:level]][item[:category]] ||= [] # array of items for this item's level and category 
    table2[item[:level]][item[:category]] << item[:title] # add item to its corresponding array 
end 

# Print headers for table 1 
puts 
puts 'Title | Level | Category' 

# Print rows for table 1 
table1.each do |item| 
    print item.values 
    puts 
end 

# Print headers for table 2 
puts 
print 'Level | ' 
categories.each do |category| 
    print category + ' | ' 
end 
puts 

# Print rows for table 2 
table2.each do |level, categorised_items| 
    row = 0 

    loop do 
    last_row = true 

    # level for this row 
    print level 
    print ' | ' 

    # print item for each category 
    categories.each do |category| 
     if categorised_items[category] && categorised_items[category][row] 
     print categorised_items[category][row] + ' | ' 

     # check if an item exists for the next row 
     last_row = false if categorised_items[category][row + 1] 
     else 
     print ' | ' 
     end 
    end 

    puts 

    break if last_row 

    row += 1 
    end 
end 

输出:

Title | Level | Category 
["Item 1", 1, "Category 1"] 
["Item 2", 1, "Category 2"] 
["Item 3", 2, "Category 3"] 
["Item 5", 3, "Category 3"] 
["Item 6", 1, "Category 1"] 
["Item 7", 2, "Category 2"] 
["Item 8", 4, "Category 1"] 
["Item 9", 4, "Category 3"] 

Level | Category 1 | Category 2 | Category 3 | 
1 | Item 1 | Item 2 | | 
1 | Item 6 | | | 
2 | | Item 7 | Item 3 | 
3 | | | Item 5 | 
4 | Item 8 | | Item 9 | 
+0

谢谢cthorne,我会申请你的解决方案,并回到你身边:) – Yousef