如何在像谷歌这样的java中实现自定义自动建议

时间:2017-08-20 04:57:43

标签: java autocomplete

如何实现基于Java的Auto建议。假设我有不同类型的数据,如firstName,rollNumber,address。

我的第一个要求是,如果用户在文本框中输入第一个字符,那么结果应该根据firstName按自然顺序排序,并且应显示10个结果。

空格后如果使用输入第二个字符,如果它是numbere则RollNumber其他lastName应按自然顺序排序为升序。

或者如果用户键入第三个字符,则地址应按升序显示。应该没有数据库,您不必实施 Solr 或其他api。如何在纯Java上实现。

这里我没有实现文本框,但我只是举了一个例子来演示

public void selectUpdateItem(String orderName, String oldQuantity, String newQuantity) {

    if (TextUtils.isEmpty(order)) {
        return;
    }

    ContentValues contentValues = new ContentValues();

    final String whereClause = SQLiteCBLC.COL_ORDNAME + " =?";
    final String[] whereArgs = {
            orderName
    }; 

    // if you want to update with respect of quantity too. try this where and whereArgs below

    //final String whereClause = SQLiteCBLC.COL_ORDNAME + " =? AND " + SQLiteCBLC.COL_QUANTITY + " =?";
    //final String[] whereArgs = {
            //orderName, String.valueOf(oldQuantity)
    //};

    contentValues.put(SQLiteCBLC.COL_QUANTITY, newQuantity);

    SQLiteDatabase sqLiteDatabase = sqLiteCBLC.getWritableDatabase();
    sqLiteDatabase.update(SQLiteCBLC.TABLE_NAME, contentValues,
            whereClause, whereArgs);
}

3 个答案:

答案 0 :(得分:3)

首先,你的问题是不完整和误导的。它没有正确描述要求。但总的来说我认为

您希望Google在文本框中使用(?)建议器

它没有告诉任何具体的事情。你的前端怎么样?你的数据怎么样?

我认为你只想拥有一个类似应用程序的控制台,你将部分字符串作为输入,你的方法将猜测字符串的其余部分作为假数据的假设。我是对的吗?

如果那是您正在寻找的东西,那么我只是在下面描绘了一个演示代码

static List<String> query(String queryStr, List<Student> list) {
        List<String> suggestion = new ArrayList<>();
        list.forEach(std -> {
            if (isMatched(queryStr, String.valueOf(std.getRoll()))) {
                suggestion.add(String.valueOf(std.getRoll()));
            }

            if (isMatched(queryStr, std.getName())) {
                suggestion.add(std.getName());
            }

            if (isMatched(queryStr, std.getAddress())) {
                suggestion.add(std.getAddress());
            }
        });

        return suggestion;
    }

    private static boolean isMatched(String query, String text) {
        return text.toLowerCase().contains(query.toLowerCase());
    }

这段代码有什么作用?它实际上是用户输入的部分字符串和您的List<Student>作为参数。然后它遍历列表并匹配所有字段以进行部分匹配。如果任何字段与查询匹配,则在建议列表中添加该值。在主要内容你可以这样做:

public static void main(String[] args) {

        List<Student> list = new ArrayList<>();
        list.add(new Student(101, "Abc ghi", "USA"));
        list.add(new Student(102, "DEF", "UST"));
        list.add(new Student(103, "Ghi ab", "DSjkD"));
        list.add(new Student(104, "jKL ut", "USN"));
        list.add(new Student(105, "MNP", "TSA101"));
        list.add(new Student(106, "UTC ABC", "ESA"));

        List<String> sugg = query("01", list);
        sugg.forEach(System.out::println);
    }

你会发现控制台打印如下:

101
TSA101

有意义吗?它可能不是你整个令人困惑的要求。但我认为你有这个主意。您可以利用它来满足您自己的要求。您可以进一步暗示您的排序逻辑或任何类型的过滤器。这应该不是那么艰难。

但你应该担心,对于大量的收集或复杂的相关对象,这是不够的。真实世界的应用程序不能直接使用。您可能需要考虑很多其他事情,如内存,I / O和执行时间。

祝你好运!

答案 1 :(得分:0)

请参阅https://github.com/nikcomestotalk/autosuggest/

这个实现是基于Patricia trie和编辑距离算法的java。

此应用程序的一些显着特征是

  1. 自动更正关键字
  2. 支持排序和个性化支持。
  3. 过滤支持。
  4. 限制支持。
  5. 在http服务器中构建。
  6. 快速搜索。
  7. 欢迎大家提供反馈

    Solr / Lucene / Elastic不会自由选择算法和个性化支持。

答案 2 :(得分:0)

您可以使用Trie数据结构进行自动建议,并且插入和搜索的时间复杂度为O(word_length)。

Apache commons提供了“ org.apache.commons.collections4.Trie”实现

示例:

Trie<String, String> trie = new PatriciaTrie<>();

        trie.put("abcd", "abcd");
        trie.put("abc", "abc");
        trie.put("abef", "abef");

        SortedMap<String, String> map = trie.prefixMap("ab");

        map.forEach((k, v) -> {
            System.out.println(k + "  " + v);
        });