Ruby读取一个文件,用一个键和数据创建一个散列,然后按字母顺序排序
我有一个如下所示的文件,需要将其放入散列:Ruby读取一个文件,用一个键和数据创建一个散列,然后按字母顺序排序,ruby,sorting,hash,Ruby,Sorting,Hash,我有一个如下所示的文件,需要将其放入散列: GHIThree, Line, Number DEFNumber, Two, Line ABCLine, Number, One 我需要做的是将前3个字符转换为键,然后将行的其余部分转换为值 所以当我打印散列时,它应该是这样的: Keys Values ABC Line, Number, One DEF Number, Two, Line GHI Three, Line, Number 这是我得到的,到处都是,但在这里: lines = File.
GHIThree, Line, Number
DEFNumber, Two, Line
ABCLine, Number, One
我需要做的是将前3个字符转换为键,然后将行的其余部分转换为值
所以当我打印散列时,它应该是这样的:
Keys Values
ABC Line, Number, One
DEF Number, Two, Line
GHI Three, Line, Number
这是我得到的,到处都是,但在这里:
lines = File.open("homework02.txt").read.split
fHash = {}
lines.each do |line|
next if line == ""
fHash[line[0..2]] = line[3..-1]
end
f = File.open("homework02.txt")
fHash = {}
loop do
x = f.gets
break unless x
fHash[x[0..2]] = x[3..-1]
end
puts fHash
f.close
试着这样做:
result = {}
CSV.foreach('file.csv', skip_blanks: true) do |row|
result[row[0].slice!(0..2)] = row
end
result.sort.to_h
另一种方式:
fHash = { 4=>1, 1=>1, 3=>2 }
fHash.keys.sort.each_with_object({}) { |k,h| h[k]=fHash[k] }
#=> {1=>1, 3=>2, 4=>1}
步骤如下:
a = fHash.keys
#=> [4, 1, 3]
b = a.sort
#=> [1, 3, 4]
enum = b.each_with_object({})
#=> #<Enumerator: [1, 3, 4]:each_with_object({})>
您将看到,当enum
的元素被传递到块时,哈希值将发生变化
块变量k
和h
分配给enum
的第一个元素:
k,h = enum.next
#=> [1, {}]
k #=> 1
h #=> {}
并且执行块计算:
h[k]=fHash[k]
#=> h[1] = { 4=>1, 1=>1, 3=>2 }[1]
# h[1] = 1
h #=> {1=>1}
enum
的第二个元素被传递到块并重复操作:
k,h = enum.next
#=> [3, {1=>1}]
h[k]=fHash[k]
#=> h[3] = { 4=>1, 1=>1, 3=>2 }[3]
# h[3] = 2
h #=> {1=>1, 3=>2}
enum
的第三个也是最后一个元素被传递到块:
k,h = enum.next
#=> [4, {1=>1, 3=>2}]
h[k]=fHash[k]
#=> h[4] = { 4=>1, 1=>1, 3=>2 }[4]
# h[4] = 1
h #=> {1=>1, 3=>2, 4=>1}
你的问题是什么?哦,对不起,我需要按字母顺序对文件进行排序,键入错误的文件,现在已将其修复。
to_a
不是必需的,还有..@caryswovel,我意识到这是隐式调用的。但可能不会有什么害处。
k,h = enum.next
#=> [3, {1=>1}]
h[k]=fHash[k]
#=> h[3] = { 4=>1, 1=>1, 3=>2 }[3]
# h[3] = 2
h #=> {1=>1, 3=>2}
k,h = enum.next
#=> [4, {1=>1, 3=>2}]
h[k]=fHash[k]
#=> h[4] = { 4=>1, 1=>1, 3=>2 }[4]
# h[4] = 1
h #=> {1=>1, 3=>2, 4=>1}