Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/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_String_Data Structures_Comparison - Fatal编程技术网

Java 查找字符串值的最快方法

Java 查找字符串值的最快方法,java,string,data-structures,comparison,Java,String,Data Structures,Comparison,我有一个简单的应用程序,可以从大文本文件中读取小字符串的数据,并将它们保存到数据库中。为了实际保存每个这样的字符串,应用程序调用以下方法几次或数千次以上: setValue(String value) { if (!ignore(value)) { // Save the value in the database } } 目前,我通过连续比较一组字符串来实现ignore方法,例如 public boolean ignore(String value)

我有一个简单的应用程序,可以从大文本文件中读取小字符串的数据,并将它们保存到数据库中。为了实际保存每个这样的字符串,应用程序调用以下方法几次或数千次以上:

setValue(String value)
{
    if (!ignore(value))
    {
         // Save the value in the database
    }
}
目前,我通过连续比较一组字符串来实现ignore方法,例如

public boolean ignore(String value)
{
    if (value.equalsIgnoreCase("Value 1") || (value.equalsIgnoreCase("Value 2"))
    {
        return true;
    }

    return false;
}
但是,由于我需要检查许多这样的可忽略值,这些值将在代码的另一部分中定义,因此我需要使用数据结构进行检查,而不是使用多个连续的if语句

所以,我的问题是,从标准Java到实现这一点最快的数据结构是什么?哈希图?一套?还有别的吗

初始化时间不是问题,因为它将静态地发生,并且每次应用程序调用一次

编辑:到目前为止,建议的解决方案(包括HashSet)似乎比只使用字符串[]和所有被忽略的单词并对其中每个单词运行equalsIgnoreCase要慢。

使用a,以小写形式存储值及其方法,该方法比TreeSet constant time vs log time for contains具有更好的查找性能

Set<String> ignored = new HashSet<String>();
ignored.add("value 1"); // store in lowercase
ignored.add("value 2"); // store in lowercase

public boolean ignore(String value) {
    return ignored.contains(value.toLowerCase());    
}
以小写形式存储值并搜索小写输入避免了在比较过程中处理大小写的麻烦,因此您可以获得哈希集实现的全速速度和零收集相关代码来编写例如Collator、Comparator等

编辑 感谢Jon Skeet指出,某些土耳其语字符在调用toLowerCase时行为异常,但是如果您不打算支持土耳其语输入,或者支持其他具有非标准大小写问题的语言,那么这种方法将非常适合您

使用a,以小写形式存储值,以及它的方法,对于contains,它比TreeSet常量时间和日志时间具有更好的查找性能

Set<String> ignored = new HashSet<String>();
ignored.add("value 1"); // store in lowercase
ignored.add("value 2"); // store in lowercase

public boolean ignore(String value) {
    return ignored.contains(value.toLowerCase());    
}
以小写形式存储值并搜索小写输入避免了在比较过程中处理大小写的麻烦,因此您可以获得哈希集实现的全速速度和零收集相关代码来编写例如Collator、Comparator等

编辑
感谢Jon Skeet指出,某些土耳其语字符在调用toLowerCase时行为异常,但是如果您不打算支持土耳其语输入,或者支持其他具有非标准大小写问题的语言,那么这种方法将非常适合您

在大多数情况下,我通常会从一个哈希集开始——但由于您希望不区分大小写,这使得它变得稍微困难一些

您可以尝试使用一个树状集合,使用一个适当的拼贴器来区分大小写。例如:

Collator collator = Collator.getInstance(Locale.US);
collator.setStrength(Collator.SECONDARY);

TreeSet<Object> set = new TreeSet<Object>(collator);
然后:


最好能有一种方法来存储所有被忽略值的排序规则键,但在测试时避免创建新的排序规则键,但我不知道有什么方法可以做到这一点。

在大多数情况下,我通常从一个哈希集开始—但由于您希望不区分大小写,这会使它稍微困难一些

您可以尝试使用一个树状集合,使用一个适当的拼贴器来区分大小写。例如:

Collator collator = Collator.getInstance(Locale.US);
collator.setStrength(Collator.SECONDARY);

TreeSet<Object> set = new TreeSet<Object>(collator);
然后:


如果有一种方法可以为所有被忽略的值存储排序规则键,但在测试时避免创建新的排序规则键,那就太好了,但我不知道有什么方法可以做到这一点。

将要忽略的词添加到列表中,然后检查该词是否在该列表中


这使得它是动态的。

将要忽略的单词添加到列表中,只需检查该单词是否在该列表中


这使得它是动态的。

字符串[]在性能方面似乎比其他建议的方法稍好一些,所以我将使用它

简单地说就是这样:

public boolean ignore(String value)
{
    for (String ignore:IGNORED_VALUES)
    {
        if (ignore.equalsIgnoreCase(value))
        {
            return true;
        }

        return false;
    }

被忽略的_VALUES对象只是一个字符串[],其中包含所有被忽略的值。

从性能角度看,字符串[]似乎比建议的其他方法略好,因此我将使用它

简单地说就是这样:

public boolean ignore(String value)
{
    for (String ignore:IGNORED_VALUES)
    {
        if (ignore.equalsIgnoreCase(value))
        {
            return true;
        }

        return false;
    }

被忽略的\u VALUES对象只是一个字符串[],其中包含所有被忽略的值。

如果使用Java 7,这是一种快速的方法:

public boolean ignore(String value) {
  switch(value.toLowerCase()) { // see comment Jon Skeet
    case "lowercased_ignore_value1":
    case "lowercased_ignore_value2":
      // etc
      return true;
    default:
      return false;
  }
}

如果使用Java 7,这是一种快速的方法:

public boolean ignore(String value) {
  switch(value.toLowerCase()) { // see comment Jon Skeet
    case "lowercased_ignore_value1":
    case "lowercased_ignore_value2":
      // etc
      return true;
    default:
      return false;
  }
}

这是否意味着引用集应该使用“CollationKeys”?@panzerschrek:Editing-我没有想到。这是否意味着引用集应该使用“CollationKeys”?@panzerschrek:Editing-我没有想到。另一方面,这假设您对使用小写作为执行不区分大小写比较的方法感到满意,这并不总是正确的。@Jon Skeet,不是吗?你是说有一个例子,a.toLowerCase.equalsb.toLowerCase^a.equalsIgnoreCaseb?如果是,请给出一个。对我来说,他们似乎说他们是一样的。我很高兴在这里犯错,因为我会学到一些东西!土耳其语有一些奇怪的地方。如果a=ma\u0131l和b=ma\u0130L,则会出现问题。请参阅以.NET为基础但仍然相关的一些更有趣的信息。如果值全部存储在小写中,或者全部存储在大写中,会有什么区别吗?我会
当然是一样的。@Bohemian:Jon所说的一个例子是MAIL.toLowerCase将返回土耳其语地区的maıl,因此它不会像您或我所期望的那样与MAIL匹配。相反,mail.toUpperCase会返回MAİL。另一方面,这假设您对使用小写作为执行不区分大小写比较的方法感到满意,这并不总是正确的。@Jon Skeet不是吗?你是说有一个例子,a.toLowerCase.equalsb.toLowerCase^a.equalsIgnoreCaseb?如果是,请给出一个。对我来说,他们似乎说他们是一样的。我很高兴在这里犯错,因为我会学到一些东西!土耳其语有一些奇怪的地方。如果a=ma\u0131l和b=ma\u0130L,则会出现问题。请参阅以.NET为基础但仍然相关的一些更有趣的信息。如果值全部存储在小写中,或者全部存储在大写中,会有什么区别吗?我猜也是一样。@Bohemian:Jon说的一个例子是MAIL.toLowerCase将返回土耳其语地区的maıl,因此它不会像您或我预期的那样与MAIL匹配。相反地,mail.toUpperCase会返回MAİL。这是非常缓慢的。他说,这是随着时间的推移而增长的,对比是以千为单位的。他说,它随着时间的推移而增长,这种比较有数千种。