首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助将ruby散列的内容打印到表中

需要帮助将ruby散列的内容打印到表中
EN

Stack Overflow用户
提问于 2016-02-15 09:45:40
回答 3查看 38关注 0票数 0

我有一个包含以下内容的文件:

代码语言:javascript
复制
PQRParrot, Quagga, Raccoon
DEFDo statements, Else statements, For statements
GHIGeese, Hippos, If statements
YZ Yak, Zebra
JKLJelly Fish, Kudu, Lynx
MNOManatee, Nautilus, Octopus
ABCApples, Boas, Cats
VWXVulture, While statements, Xmen
STUSea Horse, Tapir, Unicorn

我需要将其显示在一个表中,如下所示:

代码语言:javascript
复制
Key Data
ABC Apples, Boas, Cats
DEF Do statements, Else statements, For statements
GHI Geese, Hippos, If statements
JKL Jelly Fish, Kudu, Lynx
MNO Manatee, Nautilus, Octopus
PQR Parrot, Quagga, Raccoon
STU Sea Horse, Tapir, Unicorn
VWX Vulture, While statements, Xmen
YZ Yak, Zebra

以下是我到目前为止拥有的代码:

代码语言:javascript
复制
lines = File.open("file.txt").read.split
fHash = {}
lines.each do |line|
  next if line == ""
  fHash[line[0..2]] = line[3..-1]
end

f = File.open("file.txt")
fHash = {}
loop do
  x = f.gets
  break unless x
  fHash[x[0..2]] = x[3..-1]
end

fHash = fHash.to_a.sort.to_h

puts fHash

f.close

这是代码输出的内容:

代码语言:javascript
复制
{ "ABC" => "Apples, Boas, Cats\n",
  "DEF" => "Do statements, Else statements, For statements\n",
  "GHI" => "Geese, Hippos, If statements\n",
  "JKL" => "Jelly Fish, Kudu, Lynx\n",
  "MNO" => "Manatee, Nautilus, Octopus\n",
  "PQR" => "Parrot, Quagga, Raccoon\n",
  "STU" => "Sea Horse, Tapir, Unicorn\n", 
  "VWX" => "Vulture, While statements, Xmen\n",
  "YZ " => "Yak, Zebra\n"
}

因此,我要做的是读取文件的内容,取前三个字符并将其设置为键,其余字符设置为数据,按键值对散列进行排序,然后将数据显示为表。

我环顾四周,发现了一些与我的问题相似的东西,但都没有解决我的问题。

EN

回答 3

Stack Overflow用户

发布于 2016-02-15 12:07:02

我觉得你想得太多了。如果您有一个包含这些内容的文件,要打印表,您需要做的就是在每行的第三个字符后插入一个空格,然后对它们进行排序(或者反过来)。这很简单:

代码语言:javascript
复制
lines = File.foreach("homework02.txt")
          .map {|line| line.insert(3, " ") }

puts "Key Data"
puts lines.sort

相反,如果您想要从文件的各行构建Hash,您所要做的就是:

代码语言:javascript
复制
hsh = File.foreach("homework02.txt")
        .map {|line| [ line.slice!(0,3), line ] }
        .sort.to_h

这将构建一个由两个元素组成的数组,其中第一个元素是每行的前三个字符,第二个元素是该行的其余部分,然后对其进行排序并将其转换为散列。

然后,要打印表:

代码语言:javascript
复制
puts "Key Data"
puts hsh.map {|key, val| "#{key} #{val}" }
票数 2
EN

Stack Overflow用户

发布于 2016-02-15 10:21:26

我通过改变它的排序方式让它工作。更新了下面的代码。

代码语言:javascript
复制
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

fHash = Hash[fHash.sort_by { |k, v| k }]

print "Key ", " Data \n"

fHash.each do |key, val|
print key, " ", val
end

f.close
票数 0
EN

Stack Overflow用户

发布于 2016-02-15 12:19:11

我假设每行都以一个或多个大写字母开头,然后是一个可选的空格,然后是一个大写字母,最后是一个小写字母。

代码

代码语言:javascript
复制
R = /
    \A[A-Z]+       # Match start of string followed by one or more capital letters
    \K             # Forget everything matched so far
    (?=[A-Z][a-z]) # Match a capital letter followed by a lowercase letter
                   # in a postive lookahead
    /x             # Extended/free-spacing regex definition mode

逐行读取文件,格式化每行,在第一个空格上对每行进行分区并排序:

代码语言:javascript
复制
def make_string(fname)
  File.foreach(fname).map { |s| s.gsub(R, ' ').chomp.partition(' ') }.
       sort.
       map(&:join)
end

如果你想创建指定的散列,你可以这样写:

代码语言:javascript
复制
def make_hash(fname)
  File.foreach(fname).map { |s| s.gsub(R, ' ').chomp.partition(' ') }.
     sort.
     map { |f,_,l| [f,l] }.
     to_h
end

在正则表达式中,字符串的第一部分不能在正后视中匹配,因为匹配是可变长度的。这就是我使用\K的原因,它没有这个限制。

示例

首先,让我们创建文件:

代码语言:javascript
复制
str = <<_
PQRParrot, Quagga, Raccoon
DEFDo statements, Else statements, For statements
GHIGeese, Hippos, If statements
YZ Yak, Zebra
JKLJelly Fish, Kudu, Lynx
MNOManatee, Nautilus, Octopus
ABCApples, Boas, Cats
VWXVulture, While statements, Xmen
STUSea Horse, Tapir, Unicorn
_

FName = 'temp'
File.write(FName, str)
  #=> 265 

然后

代码语言:javascript
复制
puts make_string(FName)
ABC Apples, Boas, Cats
DEF Do statements, Else statements, For statements
GHI Geese, Hippos, If statements
JKL Jelly Fish, Kudu, Lynx
MNO Manatee, Nautilus, Octopus
PQR Parrot, Quagga, Raccoon
STU Sea Horse, Tapir, Unicorn
VWX Vulture, While statements, Xmen
YZ Yak, Zebra

make_hash(FName)
  #=> {"ABC"=>"Apples, Boas, Cats",
  #    "DEF"=>"Do statements, Else statements, For statements",
  #    "GHI"=>"Geese, Hippos, If statements",
  #    "JKL"=>"Jelly Fish, Kudu, Lynx",
  #    "MNO"=>"Manatee, Nautilus, Octopus",
  #    "PQR"=>"Parrot, Quagga, Raccoon",
  #    "STU"=>"Sea Horse, Tapir, Unicorn",
  #    "VWX"=>"Vulture, While statements, Xmen",
  #    "YZ"=>"Yak, Zebra"} 

作为第二个示例,假设:

代码语言:javascript
复制
str = <<_
PQRSTUVParrot, Quagga, Raccoon
DEFDo statements, Else statements, For statements
Y Yak, Zebra
_

FName = 'temp'
File.write(FName, str)
  #=> 94

然后

代码语言:javascript
复制
puts make_string(FName)
PQRSTUV Parrot, Quagga, Raccoon
Y Yak, Zebra

make_hash(FName)
  # => {"DEF"=>"Do statements, Else statements, For statements",
  #     "PQRSTUV"=>"Parrot, Quagga, Raccoon", "Y"=>"Yak, Zebra"} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35400312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档