将Ruby中的两个文件与不同的数据类型进行比较

时间:2015-02-14 01:01:42

标签: ruby

我今天接受了采访,想要了解如何解决这个问题。我回答了这个问题,但在我看来,我认为有更好的方法。

以下是该方案。您有两个需要比较的文件。在第一个文件中,您有一个NFL团队缩写的字符串格式列表,例如:

ARI
CHIC
GB
NYG
DET
WASH
PHL
PITT
STL 
SF
CLEV
IND
DAL
KC      

在第二个文件中,您将在散列或json中获得以下信息,例如:

"data":
  {"description": name: "CLEV","totfd":26,"totyds":396,"pyds":282,"ryds":114,"pen":4,"penyds":24,
"trnovr":0,"pt":4,"ptyds":163,"ptavg":36,"top":"37:05"}},"players":null}

如何获取第一个文件中的字符串(缩写)并查看该缩写是否包含在第二个文件的数据中?所以,例如我想看看CLEV,ARI,WASH等是否会在第二个文件中的任何位置。如果包含该缩写,我希望根据该缩写提取信息。

这是我的回答: 我会遍历每个缩写,在第二个文件中查找特定的缩写。

我觉得我的答案很差,但我想知道其他人是否对他们会做什么有好主意。

感谢

Mike Riley

1 个答案:

答案 0 :(得分:1)

你应该在面试中提问。我要问的一些问题:

hash / json是否包含团队的重复数据?意思是,CLEV会有多个记录吗?如果没有,现在你知道你有独特的数据,所以不需要提前分组。

如果它不是唯一的,我会得到散列中存在的所有名称的列表,因此您可以在给定的数组和另一个文件之间进行比较。

对于值查找的遍历+ O(logN),这是O(n):

hash =  [{'description': 'some team', 'name': 'CLEV','totfd':26,'totyds':396,'pyds':282 },
         {'description': 'some team', 'name': 'PHL','totfd':26,'totyds':396,'pyds':282 }]


hash_names = hash.map { |team| team[:name] }

现在我们在哈希中有一个名字列表,我们可以找出重叠的位置。我们可以将两个数组加在一起,并找出谁在那里出现多次。有很多方法可以做到这一点,但我们应该保持O(n)的运行时间:

list = ["ARI","CHIC","GB","NYG","DET","WASH","PHL","PITT","STL","SF","CLEV","IND","DAL"]

teams_in_both = (list + hash_names).group_by { |team| team }.keep_if { |_, occ| occ.size > 1 }.map(&:first)

现在我们有一个清单:

["PHL", "CLEV"]

我们足够了解谁对我们很重要,并可以相应地获取剩余数据。