Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据“有效搜索”;以“开始”;_Java_Algorithm_Loops_Search - Fatal编程技术网

Java 根据“有效搜索”;以“开始”;

Java 根据“有效搜索”;以“开始”;,java,algorithm,loops,search,Java,Algorithm,Loops,Search,我在写下面问题的逻辑时遇到了一些问题 我有两个字符串数组列表: 清单1:包含500万个字符串 列表2:将根据用户输入创建,并包含一些字符串/字符(例如a、b、c、g、l、pd、sp、mta) 现在,我必须根据startswithstrings将列表1拆分为多个列表,就像上面的例子一样。我需要创建8个列表,以“a”、“b”、“c”、“g”、“l”、“pd”、“sp”和“mta”开头 但是上面的条件是我必须只迭代List1或List2一次。i、 e.算法的最复杂度应为列表1的大小(500万) 允

我在写下面问题的逻辑时遇到了一些问题

我有两个字符串数组列表:

  • 清单1:包含500万个字符串

  • 列表2:将根据用户输入创建,并包含一些字符串/字符(例如a、b、c、g、l、pd、sp、mta)

现在,我必须根据startswithstrings将列表1拆分为多个列表,就像上面的例子一样。我需要创建8个列表,以“a”、“b”、“c”、“g”、“l”、“pd”、“sp”和“mta”开头

但是上面的条件是我必须只迭代List1或List2一次。i、 e.算法的最复杂度应为列表1的大小(500万)

允许使用collections.sort()方法

我试过的代码

    // Create List for search strings.
    List<String> CharList = new ArrayList<String>();
    CharList.add("a");
    CharList.add("b");
    CharList.add("e");
    CharList.add("z");
    CharList.add("4");
    CharList.add("1");
    CharList.add("zi");

    List<String> recordList = new ArrayList<String>();

    // Creating dummy data with 100 character in live environment it can be
    // around 50 lakhs strings
    for (int i = 0; i < 100; i++) {
        char[] chars = "abcdefghijklmnopqrstuvwxyzABCGDKL0123456789".toCharArray();
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i1 = 0; i1 < 6; i1++) {
            char c = chars[random.nextInt(chars.length)];
            sb.append(c);
        }
        String output = sb.toString();
        recordList.add(output);
    }

    // Adding some data mannually
    recordList.add("zink");
    recordList.add("zebra");
    recordList.add("zzzzzz");
    Collections.sort(CharList, String.CASE_INSENSITIVE_ORDER);
    Collections.sort(recordList, String.CASE_INSENSITIVE_ORDER);

    System.out.println("RECORDLIST ===>" + recordList);
    System.out.println("***************************************************");
    System.out.println("Charlist ===>" + CharList);
    System.out.println("***************************************************");

    List<List> lists = new ArrayList<List>();

    int startIndex = 0, charPointer = 0;
    while (startIndex < recordList.size() && charPointer < CharList.size()) {
        List<String> temp = new ArrayList<String>();

        boolean isHit = false;
        String currentRecord = recordList.get(startIndex);
        String partitionSattement = CharList.get(charPointer);
        while (currentRecord.startsWith(partitionSattement.toUpperCase())
                || currentRecord.startsWith(partitionSattement.toLowerCase())) {
            temp.add(recordList.get(startIndex));
            isHit = true;
            startIndex++;
        }
        if (!isHit) {
            startIndex++;
        }
        if (!temp.isEmpty()) {
            lists.add(temp);
            System.out.println(CharList.get(charPointer) + "====>" + temp);
        }
        charPointer++;
    }
//为搜索字符串创建列表。
List CharList=new ArrayList();
CharList.添加(“a”);
CharList.添加(“b”);
CharList.添加(“e”);
添加(“z”);
添加(“4”);
CharList.添加(“1”);
CharList.添加(“zi”);
List recordList=new ArrayList();
//在实时环境中创建100个字符的虚拟数据
//大约5000万根弦
对于(int i=0;i<100;i++){
char[]chars=“abcdefghijklmnopqrstuvxyzabcgdkl0123456789”;
StringBuilder sb=新的StringBuilder();
随机=新随机();
for(inti1=0;i1<6;i1++){
字符c=字符[random.nextInt(字符长度)];
sb.附加(c);
}
字符串输出=sb.toString();
记录列表。添加(输出);
}
//手动添加一些数据
记录列表。添加(“zink”);
记录列表。添加(“斑马”);
记录列表。添加(“zzzzzz”);
Collections.sort(字符表、字符串、不区分大小写的顺序);
Collections.sort(记录列表、字符串、不区分大小写的顺序);
System.out.println(“记录列表==>”+记录列表);
System.out.println(“****************************************************************************”);
System.out.println(“Charlist==>”+Charlist);
System.out.println(“****************************************************************************”);
List lists=新建ArrayList();
int startIndex=0,charPointer=0;
while(startIndex”+temp);
}
charPointer++;
}

在这种情况下,仅使用
字符串
startsWith
方法是不起作用的。考虑如果第一个模式与任何输入不匹配会发生什么,您将循环输入列表中的所有字符串而不找到匹配,即使后续模式匹配确实存在。

我们需要做的是将每个模式与每个输入字符串的初始字符进行比较,并进行相应的处理。假设我们有一个输入字符串
str
和一个模式
pat
。让
subStr
成为
str
的第一个
pat.length()
字符。现在,我们可以使用
String
compareTignoreCase
方法比较
subStr
pat
。有三种情况需要考虑:

subStr
移动到下一个输入字符串

subStr==pat
添加
str
以输出
pat
,并移动到下一个输入字符串

subStr>pat
移动到下一个图案

下面是一些代码来说明(我尽可能保留了变量名)

List output=new ArrayList();

对于(int i=0;i我可以在代码中看到两个问题:

  • 您应该删除以下段:

    if (!isHit) {
        startIndex++;
    }
    
    实际上你根本不需要那个isHit变量。如果一个字符串与一个模式不匹配,那么你仍然需要将它与下一个模式进行比较

  • 您应该按降序排列数组。正如SirRaffleBuffle在另一个答案中指出的,您应该首先将字符串与较长的模式进行比较。按降序排列字符串和模式将自动解决此问题


  • 你的密码在哪里?
    if (!isHit) {
        startIndex++;
    }