【问题标题】:Java best way to perform String startsWithJava执行字符串startsWith的最佳方式
【发布时间】:2013-04-09 05:44:54
【问题描述】:

我想比较提供的字符串是否以数组中的任何字符串开头。最简单的解决方案是:

String b = ...;
boolean matched = false;
for (String a : array) {
  if (b.startsWith(a))
    match = true;
}

但是,直观地说,我想使用类似 trie 的东西来提高效率,因为字符串数组可能会变得非常大,我需要快速运行这些匹配。我可以保证这些字符串都是按字母顺序排列的。我还可以保证数组中的所有字符串的长度都为 2 或更少。在 Java 中实现这种类似 trie 的结构的最佳方法是什么?我找不到任何可以执行此操作的基于 Java 的库。

谢谢!

【问题讨论】:

标签: java string tree trie


【解决方案1】:

我想比较提供的字符串是否以任何字符串开头 在一个数组中。

嗯 - 你当然可以改进你当前的解决方案:

static boolean startsAny(final String b) {
    for (String a : array) {
        if (b.startsWith(a)) {
            return true;
        }
    }
    return false
}

您可以将String#matches 与正则表达式一起使用,但我不确定这是否更有效。您是否分析了代码并将其确定为瓶颈?

【讨论】:

  • 关于首先进行分析的好问题,而且这样更快(但不会编译 - 它需要一个最终的return false)。
  • 关于性能分析的好建议。可能我优化得太早了,我会运行一些测试看看。
【解决方案2】:

如果您确实有足够多的起始字符串以使其成为瓶颈,那么尝试确实会有所帮助。

这个问题已经在这个网站上提出并回答了:Where do I find a standard Trie based map implementation in Java?

这就是答案:https://forums.oracle.com/forums/thread.jspa?messageID=8787521

【讨论】:

  • 感谢您的链接,我记得查看帖子并没有看到标准实现。我最终只使用了一个常规的 TreeSet,并在获取其他库之前首先分析性能。再次感谢!
【解决方案3】:

一个简单的解决方案是将字符串插入Set<String>,然后对其执行两次查找,一次查找第一个字符b,如果不匹配则查找b 的前两个字符。

例如,

class StartsWithAny {
    private Set<String> set;

    public StartsWithAny(String[] array) {
        set = new HashSet<String>();
        for (String a : array) {
            set.add(a);
        }
    }

    // returns true if b starts with any strings contained in array
    // with the condition that b.length() <= 2
    public boolean startsWithAny(final String b) {
        if (b.length() > 0 && set.contains(b.substring(0, 1))) {
            return true;
        }

        if (b.length() > 1 && set.contains(b.substring(0, 2))) {
            return true;
        }

        return false;
    }
}

对此的一种变体是使用两个单独的Sets,一个用于单字符查找,一个用于两个字符查找,这会稍微提高性能。

另一种类似的方法是实现一种二分搜索算法,该算法将对排序后的数组进行操作并执行类似的功能。

【讨论】:

  • 我实际上最终只是使用 TreeSet 并进行 contains() 查找,不确定这是否比单独查找慢/快得多,但它只有 2 个字符,所以不应该是这样我觉得很不一样。谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
相关资源
最近更新 更多