【发布时间】:2023-03-18 17:56:01
【问题描述】:
我有一个文件来表示图中节点的邻接列表作为我需要解析的文本文件。第一行是节点总数。第二行是 node1,以及它连接到的节点列表(无向图)。例如
7
2 3 -1
1 3 4 5 7 -1
1 2 -1
2 6 -1
2 6 -1
4 5 -1
2 -1
line1:该图共有 7 个节点。
line2:Node1 连接 Node2、Node3。
line3:Node2连接Node1、Node3、Node4、Node5、Node7。
-1 有点没用。
这是我当前的 ruby 实现。我正在寻找一种方法来设置它
def parse_file(filename)
total_nodes = `wc -l "#{filename}"`.strip.split(' ')[0].to_i
node_hash = Hash.new
File.foreach(filename).with_index do |line, line_num|
# convert each line into an array
line = line.strip.split(" ")
# take out weird -1 at the end of txt file in each line
line = line[0...-1]
#puts "#{line_num}: #{line}"
# how come node_hash[Node.new(line_num)] = line does not work?
node_hash[Node.new(line_num)] = line
end
end
parse_file('test_data.txt')
我的节点类有一个 adjacency_nodes 数组,我可以将 node2 和 node3 推入其中。例如:node1.adjancency_nodes
class Node
attr_accessor :id, :state, :adjacent_nodes, :graph
def initialize(id)
@id = id
@adjacent_nodes = []
end
def to_s
"node #{@id}"
end
end
循环遍历此文本文件、创建新节点并将其存储在哈希中以及推送其所有相邻节点的最干净的方法是什么?
【问题讨论】:
-
我完全不喜欢 ruby,但我做过类似的事情,所以让我尝试一下。
-
如果您可以修改文件的内容,您可能会考虑进行一些更改。首先,我建议您删除第一行的节点数,因为这可以通过计算行数来确定。其次,以节点号开始每一行。这使得文件更容易被人类阅读,并避免了按行号对行进行排序的需要。第三,对于每个节点,只列出编号较高的相邻节点。由于图是无向的,因此可以很容易地得出反向连接。如果使用手工制作的文件进行测试,这将特别有用。
-
我同意,输入文件太奇怪了。我没有想到直接编辑它而不是使用 ruby 来解析!
-
开发人员一直在为他们的程序设计奇怪的输入格式。逆向工程和编写读写器的灵活性也很有用。
标签: ruby algorithm file hash nodes