Android用Double Array Trie (雙數組)實現(xiàn)關鍵字的搜索

小追兵專欄

我們項目本想用這種方法做Android的搜索提示用,也就是,在搜索框中輸入一個關鍵字,下面自動檢索出和輸入的關鍵詞匹配的關鍵字,提示用戶,用戶可以方便的從下面的提示中選擇出自己想要的關鍵字。提高用戶體驗。想要的效果如下圖:
輸入“你是你”,自動給出下面和“你是你”相關的選項。問題是我用雙數組沒有成功。只做到部分功能。完全不能實現(xiàn)如圖的效果。下面以學習,總結為不目的,并提示大家少走彎路為出發(fā)點寫的。

這里寫圖片描述

重點內容:
如果你想要這種效果,請別嘗試了。不能實現(xiàn),因為雙數組只能實現(xiàn)如果第一條那種提示,也就是只能從頭一個字開始匹配,不能實現(xiàn),第二條,第三條那種模糊,或者部分能容的匹配。下面做詳細舉例說明。

方法一 :

先上代碼,后說效果。這里用的了github的一個項目darts-java,我們用項目作為工具類。

 private void searchFor(String key) {
        String line;
        List<String> words = new ArrayList<>();

        try {
            //讀取assets目錄下的small.dic文件
            InputStreamReader inputReader = new InputStreamReader(getResources().getAssets().open("small.dic"));
            BufferedReader reader = new BufferedReader(inputReader);
            while ((line = reader.readLine()) != null) {
                words.add(line);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        DoubleArrayTrie dat = new DoubleArrayTrie();
        System.out.println("是否錯誤: " + dat.build(words));
        System.out.println(dat);
        List<Integer> integerList = dat.commonPrefixSearch(key);
        for (int index : integerList) {
            System.out.println(words.get(index));
        }
    }

從代碼可以看出來,我們將一個字典文件small.dic放在了項目的assets目錄下面,然后讀取出來。字典中的內容如下:

一舉
一舉一動
一舉成名
一舉成名天下知
萬能
萬能膠

輸入:一舉
查詢結果:一舉


輸入:一舉成名
查詢結果:

一舉 一舉成名


輸入:一舉成名天下知
查詢結果:

一舉 一舉成名 一舉成名天下知


由此可見,不是我們想要的結果,這是輸入關鍵詞后,匹配字典。查詢目的都反了。不符合放棄。本想自己改,可是發(fā)現(xiàn)要研究算法就夠我耗費巨大的體力,所以放棄里自己修改的想法。

方法二:

同樣的先上代碼,后說效果。這里用的了github的一個項目DoubleArrayTrie,我們用項目作為工具類。

 private void searchFor1(String key) {
        ArrayList<String> words = new ArrayList<String>();
        String line;
        try {
            //讀取assets目錄下的small.dic文件
            InputStreamReader inputReader = new InputStreamReader(getResources().getAssets().open("small.dic"));
            BufferedReader reader = new BufferedReader(inputReader);
            while ((line = reader.readLine()) != null) {
                words.add(line);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        DoubleArrayTrie1 dat = new DoubleArrayTrie1();
        for (String word : words) {
            try {
                dat.Insert(word);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        System.out.println(dat.Base.length);
        System.out.println(dat.Tail.length);

        System.out.println(dat.Exists(key));
        ArrayList<String> strings = dat.FindAllWords(key);
        for (int i = 0; i < strings.size(); i++) {
            System.out.println(strings.get(i));
        }
    }

讓我們看看結果吧:


輸入:
查詢結果:
一舉 一舉一動 一舉成名 一舉成名天下知


輸入:一舉成
查詢結果:
一舉成名 一舉成名天下知


可見,這基本是我想要的效果了??墒沁@也只能是基本效果,不能作為我們的解決方案,因為當我們輸入中間某個關鍵字,就會什么也搜不到,例如:天下,我們什么都查不到。所以就這能這樣了。

字典文件只是一個舉例,我們打算的是從數據庫導出一個文件,這個文件格式還沒有確定,不過被上面的技術否定了,就沒有繼續(xù)。如果你有好的方案,可以留言。可能大多數的搜索,是服務器端做的搜索引擎吧。時間原因,我們還沒做引擎。

參考博客:

博客一

博客二

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,063評論 25 709
  • 國U22在江蘇江陰迎戰(zhàn)洪都拉斯隊。上半場洪都拉斯表現(xiàn)出色,34分鐘一腳世界波攻破中國隊大門,5分鐘之后洪都拉斯隊再...
    羅哥聊求閱讀 523評論 0 0
  • 準備材料。一只兔子。需要一斤泡椒,一瓶泡野山椒,半斤泡姜,花椒適量,大蒜半斤,老姜1兩。芹菜,蒜苗各半斤,香菜2兩...
    趙霞1閱讀 347評論 0 0
  • 1.感恩同修們精進的修行,鼓勵我不斷的前進,不能松懈,感恩仰心的文章,隨喜她堅持傳播智慧,寫的越來越好了 2.感恩...
    柔光寶寶閱讀 200評論 0 0
  • 2014年的早春,奶奶突然就離開了我們。至今我還記得接完母親電話那一剎那的感覺,心里突然就開了一個大洞,風呼呼的吹...
    你好啟櫟閱讀 143評論 3 3

友情鏈接更多精彩內容