prefixstorage 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/storage.rb +156 -0
  3. data/lib/tree_node.rb +25 -0
  4. metadata +44 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 08dea8d443691e75e4c8b082a5f19a07bec791df
4
+ data.tar.gz: 254f3635a73b7aa7f7bb871be1187f9d1003e779
5
+ SHA512:
6
+ metadata.gz: aadc261a2a65cbf9931042c9d3b306e058f695740f51252a407ecf629104de86a91969c0b293abb2a013d717ade9f340213975e067cdd319050c8e5bf4eb4183
7
+ data.tar.gz: cebbf6981365b038a5f83ffdebe69338ef4a99b516be9f0fc38652db0821c1bc108d5e0f85cd3f4644f856a1a59747243bfff0fb960de918c5b4fd97591c95ab
@@ -0,0 +1,156 @@
1
+ require "rubygems"
2
+ require "zip/zip"
3
+
4
+ class Storage
5
+
6
+ require_relative 'tree_node'
7
+
8
+ def initialize
9
+ @root = TreeNode.new
10
+ end
11
+
12
+ #adds new string to storage
13
+ def add(str)
14
+
15
+ words = (str.split ",").map! { |word| word.strip }
16
+
17
+ words.each do |word|
18
+ node = @root
19
+ word.split(//).each do |ch|
20
+ node.children[ch]=TreeNode.new if node.children[ch].nil?
21
+
22
+ node = node.children[ch]
23
+
24
+ end
25
+ node.is_leaf=true
26
+ end
27
+ @root.children
28
+ end
29
+
30
+
31
+ #checks if storage contains string
32
+ def contains(str)
33
+ node = @root
34
+ str.each_char do |ch|
35
+
36
+ return false if node.children[ch].nil?
37
+
38
+ node = node.children[ch]
39
+ end
40
+ node.is_leaf?
41
+
42
+ end
43
+
44
+
45
+ #returns all strings that start with str
46
+ def find(str)
47
+ node = @root
48
+ str.each_char do |ch|
49
+
50
+ return [] if node.children[ch].nil?
51
+
52
+ node = node.children[ch]
53
+ end
54
+ words = []
55
+ get_all_words node, str, words
56
+
57
+ words
58
+ end
59
+
60
+
61
+ def load_from_file(file_name)
62
+ file_to_read = File.open(file_name, "r")
63
+ read_from_file file_to_read
64
+ file_to_read.close
65
+ end
66
+
67
+ def save_to_file(file_name)
68
+ file_to_write = File.new(file_name, "w+")
69
+ write_to_file file_to_write
70
+ file_to_write.close
71
+
72
+ end
73
+
74
+
75
+ def load_from_zip (zip_name)
76
+ zip_name = zip_name+".zip" unless zip_name.end_with? ".zip"
77
+ Zip::ZipFile.foreach(zip_name) do |file|
78
+ read_from_file file.get_input_stream
79
+ end
80
+
81
+ end
82
+
83
+ def save_to_zip (zip_name, result_file_name)
84
+ zip_name = zip_name+".zip" unless zip_name.end_with? ".zip"
85
+ Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) do |zipfile|
86
+ zipfile.get_output_stream(result_file_name)do |f|
87
+ write_to_file f
88
+ end
89
+ end
90
+
91
+ end
92
+
93
+
94
+ private
95
+ def get_all_words(node, ch, words)
96
+ str = String.new(ch)
97
+ if node.is_leaf?
98
+ words.push str
99
+ end
100
+ if !node.children.empty?
101
+
102
+
103
+ node.children.each do |key, value|
104
+ get_all_words(value, str+key, words)
105
+
106
+
107
+ end
108
+
109
+
110
+ end
111
+
112
+
113
+ end
114
+
115
+ def read_from_file(file_to_read)
116
+ lines = file_to_read.readlines
117
+ lines.each {|line| add(line)}
118
+
119
+
120
+ end
121
+
122
+ def write_to_file(file_to_write)
123
+ words = find("")
124
+ if !words.empty?
125
+ last_word =
126
+ words.each {|word| file_to_write.write(word+", ")}
127
+ file_to_write.write last_word
128
+ end
129
+
130
+ end
131
+
132
+ end
133
+ #ant
134
+ # chor
135
+ # ient
136
+
137
+ =begin
138
+ storage = Storage.new
139
+ puts storage.add ""
140
+ puts storage.add "te, spec ,tetra, post, rock, postcard, trunk, pork"
141
+
142
+ puts storage.contains "te"
143
+
144
+ storage.load_from_file "../test_file"
145
+ puts storage.find ""
146
+
147
+ storage.save_to_file "../result.txt"
148
+ puts File.readline "../result.txt"
149
+ #storage.save_to_zip "result", "result.txt"
150
+
151
+ #storage.load_from_zip "result"
152
+
153
+
154
+
155
+ =end
156
+
@@ -0,0 +1,25 @@
1
+ class TreeNode
2
+
3
+ def initialize
4
+ @children = {}
5
+ @is_leaf = false
6
+ end
7
+
8
+ def is_leaf?
9
+ @is_leaf
10
+ end
11
+
12
+ def is_leaf=(is_leaf)
13
+ @is_leaf = is_leaf
14
+
15
+ end
16
+
17
+ def children
18
+ @children
19
+ end
20
+
21
+ def to_s
22
+ children.to_s
23
+ end
24
+
25
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prefixstorage
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Artem Petrik
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2012-04-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Gem for storing strings in prefix tree (Trie)
14
+ email: earsonheart@gmeil.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/storage.rb
20
+ - lib/tree_node.rb
21
+ homepage: ''
22
+ licenses: []
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.0.3
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Prefix tree strings storage
44
+ test_files: []