2017-08-20 83 views
1

如何實現基於Java的自動建議。假設我有不同類型的數據,如firstName,rollNumber,address。如何在java中實現自定義自動建議如google

我的第一個要求是,如果用戶在文本框中輸入第一個字符,那麼結果應該按照基於firstName的自然順序排序,並且應該顯示10個結果。

空格後如果使用輸入第二個字符,並且如果它是numbere,那麼RollNumber else lastName應該按照自然順序按升序排序。

或者如果用戶鍵入第三個字符,則地址應按升序顯示。應該沒有數據庫,您不必執行Solr或其他api。如何在純Java上實現。

在這裏我沒有實現的文本框,但我只花了一個例子來說明

import java.util.*; 
    import java.lang.*; 
    import java.io.*; 

    // A class to represent a student. 
    class Student { 
     int rollno; 
     String name; 
     String address; 

     // Constructor 
     public Student(int rollno, String name, String address) { 
      this.rollno = rollno; 
      this.name = name; 
      this.address = address; 
     } 

     // Used to print student details in main() 
     public String toString(){ 
      return this.rollno + " " + this.name + 
           " " + this.address; 
     } 
    } 

    class Sortbyroll implements Comparator<Student> { 
     // Used for sorting in ascending order of rollno 
     public int compare(Student a, Student b) { 
      return a.rollno - b.rollno; 
     } 
    } 

    class Sortbyname implements Comparator<Student> { 
     // Used for sorting in ascending order of name 
     public int compare(Student a, Student b) { 
      return a.name.compareTo(b.name); 
     } 
    } 

    // Driver class 
    class Main { 
     public static void main (String[] args) { 
      ArrayList<Student> ar = new ArrayList<Student>(); 
      //here I have thousand student are inserted into 
      //simple collection. 

      ar.add(new Student(111, "bbbb", "london")); 
      ar.add(new Student(131, "aaaa", "nyc")); 
      ar.add(new Student(121, "cccc", "jaipur")); 

      System.out.println("Unsorted"); 
      for (int i=0; i<ar.size(); i++) { 
       System.out.println(ar.get(i)); 
      } 

      //collection sorted by rollno  
      Collections.sort(ar, new Sortbyroll()); 

      System.out.println("\nSorted by rollno"); 
      for (int i=0; i<ar.size(); i++) { 
       System.out.println(ar.get(i)); 
      } 

      //sort by Name 
      Collections.sort(ar, new Sortbyname()); 

      System.out.println("\nSorted by name"); 
      for (int i=0; i<ar.size(); i++) { 
       System.out.println(ar.get(i)); 
      } 
     } 
    } 
+0

你要使用哪種前端框架,應該使用自動提示組件下拉菜單;你可以利用它。不需要爲此編寫自己的邏輯。 – Vinoth

+0

不,我不想要任何框架,我只是想測試Java,後來我會實現框架。 – shiv

+0

那麼,你想編寫自己的基於Java的UI框架?不使用Swing,JavaFX,SWT或類似的東西?祝你好運。或者,也許你想使用UI框架,但甚至不知道存在以及從哪裏開始?如果是這樣,從決定你真正想做什麼開始。然後閱讀文檔。 –

回答

2

首先你的問題是不完整和誤導。它沒有正確描述要求。但總體我認爲

您希望谷歌像(?)在文本框中

它不會告訴任何具體的東西建議者。你的前端呢?你的數據如何?

無論如何,我覺得你只是想有一個控制檯應用程序一樣在那裏你會給部分字符串作爲輸入和你的方法將猜測的字符串的其餘部分從您的虛擬數據的假設。我對嗎 ?

如果這是你正在尋找那麼一點我剛纔概述如下

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和執行時間。

祝你好運!

0

可做參考https://github.com/nikcomestotalk/autosuggest/

這個實現是在Java基礎上帕特里夏·特里和編輯距離算法。

這個應用程序的一些顯着特徵是關鍵字

  • 分類和個性化支持桶支撐

    1. 自動校正。
    2. 過濾支持。
    3. 限制支持。
    4. 建立在http服務器中。
    5. 快速搜索。

    你們都歡迎反饋

    的Solr/Lucene的/彈性不會放棄自由選擇算法和個性化的支持。