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)
// 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++;
}