1+ class TrieNode {
2+ var cnt : Int = 0
3+ var abc : Map [Char , TrieNode ] = Map ()
4+
5+ def dump (lvl : Int = 0 , prev : String = " " ): Unit = {
6+ for (n <- abc) {
7+ (0 until lvl).foreach(x=> print(" ." ))
8+ println(n._1, n._2.cnt, prev + n._1)
9+ n._2.dump(lvl + 1 , prev + n._1)
10+ }
11+ }
12+ }
13+
14+ // префиксное дерево
15+ // поиск частоты с которой встречается слово в тексте
16+ class Trie {
17+ val root : TrieNode = new TrieNode ()
18+
19+ // вставить строку в дерево
20+ def insert (str : String ): Unit = {
21+ var cur_node = root
22+ for (c <- str) {
23+ if (! cur_node.abc.contains(c)) {
24+ cur_node.abc = cur_node.abc ++ Map (c -> new TrieNode ())
25+ }
26+
27+ cur_node = cur_node.abc(c)
28+ cur_node.cnt += 1
29+
30+ }
31+ } // insert
32+
33+ // вывести дерево
34+ def dump ()= root.dump()
35+
36+ // поиск строки в дереве: найденная строка, число повторов в тексте
37+ def find (str : String ): (String , Int ) = {
38+ var cur_node = root
39+ var prev = " "
40+ for (c <- str) {
41+ prev += c
42+ if (! cur_node.abc.contains(c)) {
43+ return (prev, cur_node.cnt)
44+ } else {
45+ cur_node = cur_node.abc(c)
46+ }
47+
48+ }
49+ return (prev, cur_node.cnt)
50+ }
51+
52+ // более длинные варианты слова
53+ def getVars (str : String ): String = {
54+ var cur_node = root
55+ var prev = " "
56+ for (c <- str) {
57+ prev += c
58+ if (! cur_node.abc.contains(c)) {
59+ return Array (prev).mkString(" , " )
60+ } else {
61+ cur_node = cur_node.abc(c)
62+ }
63+
64+ }
65+ cur_node.abc.map(c=> prev + c._1 ).toArray.mkString(" , " )
66+ }
67+
68+
69+
70+ }
71+
72+ object ExampleTrie extends App {
73+ val lines = scala.io.Source .fromFile(" C:/Users/007/Google Диск/info/articles/test.txt" ).mkString
74+ val tokens = lines.mkString.split(" " ).filter(x=> x.size > 0 ).map(_.toLowerCase)
75+
76+ var tr = new Trie ()
77+ tokens.foreach(t => tr.insert(t))
78+
79+ /*
80+ * (в,8,в)
81+ .(а,2,ва)
82+ ..(р,1,вар)
83+ * */
84+ tr.dump()
85+
86+ // латы, лати
87+ println(tr.getVars(" лат" ))
88+
89+ // (лат,2)
90+ println(tr.find(" лат" ))
91+ }
0 commit comments