如何实现基于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);
}
答案 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。
此应用程序的一些显着特征是
欢迎大家提供反馈
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);
});