从数组列表、词汇词进行java二进制搜索

从数组列表、词汇词进行java二进制搜索,java,Java,我的代码读取一个名为sort.txt的文件,其中有按字母顺序和长度排列的词典单词。每行有一个单词。程序运行良好,请不要评论它是如何编写的。然后用户输入他正在搜索的单词,例如“C**”,程序返回所有可能的匹配项(Car、Cat、Cam等)。我的问题是如何使用二进制搜索来搜索数组以加快速度。但是,只有在用户输入第一个或前两个或前3个字符时,才会使用二进制搜索,例如“Ca*”或“Mou**”。例如,如果用户输入“***se”,则程序将跳过二进制搜索并搜索整个数组 package test; impo

我的代码读取一个名为
sort.txt
的文件,其中有按字母顺序和长度排列的词典单词。每行有一个单词。程序运行良好,请不要评论它是如何编写的。然后用户输入他正在搜索的单词,例如“C**”,程序返回所有可能的匹配项(Car、Cat、Cam等)。我的问题是如何使用二进制搜索来搜索数组以加快速度。但是,只有在用户输入第一个或前两个或前3个字符时,才会使用二进制搜索,例如“Ca*”或“Mou**”。例如,如果用户输入“***se”,则程序将跳过二进制搜索并搜索整个数组

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();

    }
}}
封装测试;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.InputMismatchException;
导入java.util.Scanner;
公共班机{
公共静态void main(字符串[]args){
字符串izbira;
int-dolzina=0;
扫描仪输入=新扫描仪(系统输入);
字符串vnos;
扫描仪输入=新扫描仪(System.in);
ArrayList list1=新的ArrayList();
ArrayList list2=新的ArrayList();
ArrayList list3=新的ArrayList();
ArrayList list4=新的ArrayList();
ArrayList list5=新的ArrayList();
ArrayList list6=新的ArrayList();
ArrayList list7=新的ArrayList();
ArrayList list8=新的ArrayList();
ArrayList list9=新建ArrayList();
ArrayList list10plus=新建ArrayList();
试一试{
File File=新文件(“sort.txt”);
FileReader FileReader=新的FileReader(文件);
BufferedReader BufferedReader=新的BufferedReader(文件阅读器);
丝状纹饰;
而((vrstica=bufferedReader.readLine())!=null){
如果(vrstica.length()=1){
清单1.添加(vrstica);
}
如果(vrstica.length()=2){
清单2.添加(vrstica);
}
如果(vrstica.length()=3){
清单3.添加(vrstica);
}
如果(vrstica.length()=4){
清单4.添加(vrstica);
}
如果(vrstica.length()=5){
清单5.添加(vrstica);
}
如果(vrstica.length()=6){
清单6.添加(vrstica);
}
如果(vrstica.length()=7){
清单7.添加(vrstica);
}
如果(vrstica.length()=8){
清单8.添加(vrstica);
}
如果(vrstica.length()=9){
清单9.添加(vrstica);
}
如果(vrstica.length()>9){
列表10plus.add(vrstica);
}
}
做{
做{
System.out.println(“Vnesi dožino besede,ki jo iššeš:”);
if(在.hasNextInt()中){
dolzina=in.nextInt();
}else if(在.hasNextLine()中){
System.out.printf(“Napačen vnos!Poskusi ponovno:%n”,
in.nextLine());
} 
}while(dolzina 9){
对于(int i=0;i
这并不能给你一个完整的答案,但只能说明这个方向

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

if(vnos.charAt(0)!='*')){
//使用子字符串进行二进制搜索
}否则{
//迭代并检查字符串是否以给定后缀结尾。

}

代码太多了。有没有可能得到一个?使用它只是重复代码。我知道你不想让我们评论你的程序是如何编写的,但我想给你一个提示,
switch
-
case
-块可以让事情更容易阅读,我知道,我被禁止使用它们,这就是为什么我的评论