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}