我的MAC地址在mac1.txt和mac2.txt,我想這樣做:把比賽從到文件
v = File.open("/RubyDev/sort/mac1.txt",'r').each_line do |a|
w = File.open("/RubyDev/sort/mac2.txt",'r').each_line do |b|
if w in v
puts w
end
end
end
預先感謝您的幫助!
我的MAC地址在mac1.txt和mac2.txt,我想這樣做:把比賽從到文件
v = File.open("/RubyDev/sort/mac1.txt",'r').each_line do |a|
w = File.open("/RubyDev/sort/mac2.txt",'r').each_line do |b|
if w in v
puts w
end
end
end
預先感謝您的幫助!
編輯:下面的第一個版本實際上是非常可怕的。這裏有一個更好的版本:
lines = []
File.open("mac1.txt",'r').each_line do |a|
lines.push(a.rstrip!)
end
File.open("mac2.txt",'r').each_line do |b|
if lines.include?(b.rstrip!)
puts b
end
end
我想你要尋找的是這樣的:
File.open("mac1.txt",'r').each_line do |a|
File.open("mac2.txt",'r').each_line do |b|
if a == b
puts b
end
end
end
是正確的嗎?如果不是,你能否提供更多關於這個問題的背景以及你想要完成什麼?
我還在努力學習Ruby,所以這不太可能是一個好的解決方案,但它是一種可能性。它將第一個文件的內容讀入散列,然後檢查第二個文件的內容。我認爲這將是相當有效的(呃...除非第一個文件太大而不能很好地適應內存)。
lines = Hash.new
File.open("mac1.txt", 'r').each_line do |l|
lines[l] = true
end
File.open("mac2.txt", 'r').each_line do |l|
if (lines[l] == true)
puts l
end
end
編輯爲了完整起見,這裏是非常簡潔的版本,如馬克 - 托馬斯空白去除由加文安德瑞格提出的意見建議。 Ruby是一種甜蜜的語言。
lines = Hash.new
File.open("mac1.txt", 'r').each_line {|l| lines[l.strip!] = true}
File.open("mac2.txt", 'r').each_line {|l| puts l if lines[l.strip!]}
還不錯。 Readmode是默認的,所以你可以用'File.open(「mac1.txt」)替換第一部分。each_line {| l |行[l] = true}'。第二個可以是'File.open(「mac2.txt」)。each_line {| l |把l如果行[l]}' – 2011-02-23 00:31:04
呵呵!這真的很乾淨!但它仍然遭受「\ n」v。「EOF」問題。也許這樣? 1:'lines = Hash.new' 2: 'File.open(「mac1.txt」)。each_line {| l | lines [l.rstrip!] = true}'3: 'File.open(「mac2.txt」)。each_line {| l |放行如果行[l.rstrip!]}' – 2011-02-23 00:47:38
@Gavin,我會使用行[l.chomp]'但這只是個人喜好。 – 2011-02-23 00:54:35
要獲取的所有共同線兩個文件之間,您可以使用File#readlines
訪問所有文件中的行作爲一個數組。請記住,它們仍然會附加換行符(「\ n」),因此您需要使用String#chomp
將其刪除。要做到這一點,最簡單的方法是map
的數組readlines
給你,就像這樣:
common_macs = File.open("mac1.txt").readlines.map(&:chomp) &
File.open("mac2.txt").readlines.map(&:chomp)
很好的解釋,但我不知道它是如何計算常見的mac。 – 2011-02-23 00:33:11
哎呀,應該是'&'。 – harbichidian 2011-02-23 00:35:35
lines = {}
File.open("mac1.txt").each_line {|l| lines[l.chomp] = true}
File.open("mac2.txt").each_line {|l| puts l if lines[l.chomp]}
陣列#包括是不是很有效。基於散列的解決方案更勝一籌。另外,你不需要第一個文件中的bang-method。 – 2011-02-23 01:03:09
這兩個公平點。在我看到它之前,我甚至沒有考慮過基於哈希的比較思想。當我談到Ruby時,我很綠,所以我不知道'include?'效率低下。謝謝! – 2011-02-23 01:07:31
這不是'include?'本身效率低下,但是掃描匹配元素的數組是O(n),而哈希查找是O(1)。 – 2011-02-23 02:18:33