2014-11-05 25 views
0

我的代码读取一个名为sort.txt的文件,其中有词典按字母顺序排列并按长度排序。每行有一个词。该程序正常工作,请不要评论它是如何写的。用户然后输入他正在搜索的单词,例如, “C **”,并且程序返回所有可能的匹配(汽车,猫,凸轮等)。我的问题是如何使用二进制搜索来搜索数组以加快速度。但是二进制搜索只能在用户输入第一个或前两个或前三个字符时使用,例如“Ca *”或“Mou **”。例如,如果用户输入“*** se”,那么程序将跳过二分查找并搜索整个数组。从数组列表中搜索java二进制文件,词库文字

package test; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.InputMismatchException; 
import java.util.Scanner; 

public class main{ 

public static void main(String[] args) { 
    String izbira; 
    int dolzina=0; 
    Scanner in = new Scanner(System.in); 
    String vnos; 
    Scanner input = new Scanner(System.in); 

    ArrayList list1 = new ArrayList(); 
    ArrayList list2 = new ArrayList(); 
    ArrayList list3 = new ArrayList(); 
    ArrayList list4 = new ArrayList(); 
    ArrayList list5 = new ArrayList(); 
    ArrayList list6 = new ArrayList(); 
    ArrayList list7 = new ArrayList(); 
    ArrayList list8 = new ArrayList(); 
    ArrayList list9 = new ArrayList(); 
    ArrayList list10plus = new ArrayList(); 

    try { 

     File file = new File("sort.txt"); 
     FileReader fileReader = new FileReader(file); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     String vrstica; 

     while ((vrstica = bufferedReader.readLine()) != null) { 
      if (vrstica.length() == 1) { 
       list1.add(vrstica); 
      } 
      if (vrstica.length() == 2) { 
       list2.add(vrstica); 
      } 
      if (vrstica.length() == 3) { 
       list3.add(vrstica); 
      } 
      if (vrstica.length() == 4) { 
       list4.add(vrstica); 
      } 
      if (vrstica.length() == 5) { 
       list5.add(vrstica); 
      } 
      if (vrstica.length() == 6) { 
       list6.add(vrstica); 
      } 
      if (vrstica.length() == 7) { 
       list7.add(vrstica); 
      } 
      if (vrstica.length() == 8) { 
       list8.add(vrstica); 
      } 
      if (vrstica.length() == 9) { 
       list9.add(vrstica); 
      } 
      if (vrstica.length() > 9) { 
       list10plus.add(vrstica); 
      } 
     } 
     do{ 
      do { 
       System.out.println("Vnesi dožino besede, ki jo iščeš:"); 
       if (in.hasNextInt()) { 
        dolzina = in.nextInt(); 
       } else if (in.hasNextLine()) { 
        System.out.printf("Napačen vnos! Poskusi ponovno:%n ", 
          in.nextLine()); 
       } 
      } while (dolzina <= 0); 



     System.out.println("Vnesi besedo za neznano črko vpiši * :"); 
     vnos = input.nextLine(); 
     vnos = vnos.replace("*", "."); 

     if (dolzina == 1) { 
      for (int i = 0; i < list1.size(); i++) { 
       String s = (String) list1.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 

     } 

     if (dolzina == 2) { 
      for (int i = 0; i < list2.size(); i++) { 
       String s = (String) list2.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 

     } 
     if (dolzina == 3) { 

      for (int i = 0; i < list3.size(); i++) { 
       String s = (String) list3.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 
     } 
     if (dolzina == 4) { 

      for (int i = 0; i < list4.size(); i++) { 
       String s = (String) list4.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 
     } 
     if (dolzina == 5) { 
      for (int i = 0; i < list5.size(); i++) { 
       String s = (String) list5.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 
     } 
     if (dolzina == 6) { 
      for (int i = 0; i < list6.size(); i++) { 
       String s = (String) list6.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 
     } 
     if (dolzina == 7) { 
      for (int i = 0; i < list7.size(); i++) { 
       String s = (String) list7.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 
     } 
     if (dolzina == 8) { 
      for (int i = 0; i < list8.size(); i++) { 
       String s = (String) list8.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 
     } 
     if (dolzina == 9) { 
      for (int i = 0; i < list9.size(); i++) { 
       String s = (String) list9.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 
     } 
     if (dolzina > 9) { 
      for (int i = 0; i < list10plus.size(); i++) { 
       String s = (String) list10plus.get(i); 
       if (s.matches(vnos)) 
        System.out.println(s); 
      } 

     } 
     dolzina=-1; 
     System.out.println("Ponovni vnos (da/ne):"); 
     Scanner inn= new Scanner (System.in); 
     izbira = inn.next(); 

    }while (izbira.equalsIgnoreCase("da")); 
     bufferedReader.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 

    } 
}} 
+0

这是一个很多**的代码。任何得到[mcve](http://stackoverflow.com/help/mcve)的机会? – Mureinik 2014-11-05 18:36:45

+0

使用[String.startWith()](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#startsWith(java.lang.String)) – StackFlowed 2014-11-05 18:39:15

+0

它只是重复码。相同的代码使用了10次,因为您可以快速看到 – 2014-11-05 18:43:20

回答

1

这不会给你一个完整的答案,但只是放在那个方向。

您需要检查第一个字符是否不是*,然后执行二进制搜索,否则遍历所有字符串并执行String.endsWith()

if(vnos.charAt(0) != '*') { //do binary search with the substring } else { //iterate and check if the string endsWith given suffix. }