【问题标题】:Comparing n strings in java在java中比较n个字符串
【发布时间】:2012-03-12 07:27:06
【问题描述】:

有谁知道将单个字符串与n 匹配字符串数进行比较的最快方法?

例如:单词“example”需要与包含n 个单词的列表进行比较,以进行匹配。该列表可以包含任意数量、任意长度的单词。

我可以使用特定的算法来执行此操作吗?我知道在字符串中找到子字符串的字符串匹配算法,例如 Boyer-Moore 算法。但不是为了这个。请帮帮我。请注意,我将在 Java 中实现它。

【问题讨论】:

  • 单词列表是否以任何方式排序或索引?否则你只需要在一个循环中为它们中的每一个做你的 Boyer-Moore。
  • 什么样的搭配?答案假设“匹配”是指“找到完全相同的字符串”,而不是子字符串。
  • 字符串无论如何都没有排序,是的,我正在尝试获得完全匹配(不区分大小写)
  • “不区分大小写”改变了这一点...

标签: java string string-matching


【解决方案1】:

您可以使用contains 方法。

List<String> lstr = Arrays.asList(new String[]{"a", "b", "c", "d", "e"});
Collections.sort(lstr); 

lstr.contains("c"); // true
lstr.contains("f"); // false

【讨论】:

  • 不适用于不区分大小写的匹配(请参阅问题上的 cmets)。
【解决方案2】:

运行一个循环直到列表末尾,并使用 equals() 方法比较每个元素

【讨论】:

  • +1 在这种情况下或等于IgnoreCase。此外,可能会在第一场比赛中爆发。
【解决方案3】:

您可以为您的列表准备一个Map&lt;Int,List&lt;String&gt;&gt;,其中键是字符串的.hashcode(),并且列表包含具有相同哈希码的所有字符串。

然后您只需查找新字符串的哈希码,然后对返回列表中的每个字符串运行 equals()。

应该会更快,因为要比较的条目要少得多。请注意,准备工作需要一些时间,因此只有在需要多次准备时才这样做。

【讨论】:

  • 请解释如何使其适用于不区分大小写的匹配(请参阅问题上的 cmets)。
  • 如果字符串可以小写并且仍然有意义,则在处理之前将它们小写。
【解决方案4】:

假设您只想检查完全匹配,那么您可以维护字典的哈希映射并查找单词的哈希,或者使用像 http://en.wikipedia.org/wiki/Trie 这样的树,其中每个节点都是一个字母。

与单词数量相比,两者的时间复杂度几乎是恒定的,而是取决于您正在查找的单词的长度(微不足道)。

【讨论】:

  • 假设您需要为同一个列表多次执行此操作。
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多