Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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的hash映射中搜索sql中的like-like运算符_Java - Fatal编程技术网

如何在java的hash映射中搜索sql中的like-like运算符

如何在java的hash映射中搜索sql中的like-like运算符,java,Java,我想根据用户输入搜索哈希映射。假设用户给定值“a”,我必须以公司名称开头显示,如果用户给定值“AB”,我必须以AB公司名称开头显示。我将公司名称存储在哈希映射中哈希映射只擅长根据一些可以适当哈希的相等概念查找精确匹配 两种选择: 只需使用列表,然后线性搜索即可。对于相对较少的数据量,这可能会非常有效 查找或实现一个(或前缀树),该树基本上从根节点开始,并针对用户键入的每个字符下降-结果是在用户输入下降结束时到达的节点下方的所有“有效端点”节点 您应该研究正则表达式(正则表达式) 您的公司名称

我想根据用户输入搜索哈希映射。假设用户给定值“a”,我必须以公司名称开头显示,如果用户给定值“AB”,我必须以AB公司名称开头显示。我将公司名称存储在哈希映射中

哈希映射只擅长根据一些可以适当哈希的相等概念查找精确匹配

两种选择:

  • 只需使用列表,然后线性搜索即可。对于相对较少的数据量,这可能会非常有效
  • 查找或实现一个(或前缀树),该树基本上从根节点开始,并针对用户键入的每个字符下降-结果是在用户输入下降结束时到达的节点下方的所有“有效端点”节点

您应该研究正则表达式(正则表达式)

您的公司名称是字符串,您可以使用

String regex = "A*";
myString.matches(regex);

可以在键集上循环并检查每个键。例如:

final String searchPrefix = "AB";
for(String key : map.keySet()){
    if(key.startsWith(searchPrefix)){
        System.out.println(map.get(key));
    }
}
或者,您可以循环映射中的条目

final String searchPrefix = "AB";
for(Entry<String,String> e : map.entrySet()){
    if(e.getKey().startsWith(searchPrefix)){
        System.out.println(e.getValue());
    }
}
final String searchPrefix=“AB”;
对于(条目e:map.entrySet()){
if(例如getKey().startsWith(searchPrefix)){
System.out.println(e.getValue());
}
}
  • 使用一个

    示例:

    NavigableSet<String> company=new TreeSet<String>(); 
    Set<String> filteredSet=company.tailSet(prefix);
    for(String str:filteredSet) {
     if(str.startsWith(prefix))
      //add to list
     else
      break;
    }
    
    NavigableSet company=new TreeSet();
    Set filteredSet=company.tailSet(前缀);
    for(字符串str:filteredSet){
    if(str.startsWith(前缀))
    //添加到列表中
    其他的
    打破
    }
    
  • 如果您关心性能,请使用or。与trie相比,基数树的内存效率更高


  • 听起来是个坏主意。对于一个简单的前缀搜索,正则表达式是过分的。。。
    String.startsWith
    有什么问题吗?没什么,但问题是怎么做,我建议使用regex,因为他以后可能想做更复杂的测试。如果只是这样做:开始测试,那么是和否都是多余的。(“是”因为有一种较短的编写方法,“否”因为我认为Java在后台也使用regex来完成这项工作。)@user440336否,Java迭代底层的字符数组,这比regex高效得多。特别是因为如果您多次使用
    String.matches()
    ,同一个模式会被反复编译(
    str.matches(pattern)
    pattern.compile(pattern.matcher(str.matches()
    )的快捷方式。好吧,那么我同意您是否只查找开头,然后再查找String.startsWith更有效。我从来没有在Java中真正使用过正则表达式,只是认为它和其他语言一样有效。@user426344:也检查一下这个