首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于下面的场景,在Java中使用哪种数据结构?

对于下面的场景,在Java中使用哪种数据结构?
EN

Stack Overflow用户
提问于 2013-05-02 14:31:00
回答 5查看 245关注 0票数 1

我有一组元素,它们是前缀。我必须以这样的方式编写一个Java方法,即每当它获得输入时,验证它所属的前缀,如果它与任何前缀匹配,则返回true或false。元素包括

代码语言:javascript
运行
复制
1900
1901
1902
1903
17082

输入将是

代码语言:javascript
运行
复制
1900123445
1901334455
1800777777
...

我可以使用哪种数据结构,这样它就不会影响性能。因为一次输入的数字将会达到5000万。

有人能在这方面帮我吗?提前谢谢。

EN

Stack Overflow用户

发布于 2013-05-02 14:34:28

如果可能,测试这些方法中的每一种,看看哪种方法在上下文中最快。这可能取决于各种因素,我不能真正预测哪一个在您的特定用例中工作得最好。

选项0(如果前缀很少,请使用此选项)

最简单的选择是:将您的前缀存储在一个链表中,并使用input.startsWith(prefix)检查每个前缀。很无聊。

选项1(如果有非数字前缀,则使用此选项)

k为最小前缀长度。使用HashMap,其中keys是每个前缀的firstitems链接列表,包含每个前缀的其余部分。

例如,假设您有前缀abcdabcexyz。然后,您将存储以下内容:

  • "abc"-->("d","e"),,其中("d","e")是包含元素"d""e"
  • "xyz"-->("") (其中""是空字符串)的链表。

将此地图称为prefixes,并使用以下代码来判断前缀是否正确:

代码语言:javascript
运行
复制
public boolean correctPrefix(String input){
    LinkedList check = prefix.get(input.substring(0,k))
    if (check != null){
        for (String n : check){
            if (input.substring(k).startsWith(check)) return true;
        }
    return false;
}

我不知道它对于您的目的是否足够快,尽管您还没有确切地告诉我们这些是什么;我仍然不知道Java中有什么比它更快的。

选项2(如果所有前缀都是数字的,或者您使用的是SE7)

使用switch语句。或者,使用多个switch语句,每个语句对应一个可能的前缀长度。例如,假设您有前缀1901190220050

代码语言:javascript
运行
复制
public boolean correctPrefix(String input){
    int pVal;
    pVal = Integer.parseInt(input.substring(0,4));
    switch (pval){
    case 1901: return true;
    case 1902: return true;
    }
    pVal = Integer.parseInt(input.substring(0,5));
    switch (pval){
    case 20050: return true;
    }
    return false;
}

这将会有更多的代码,但我怀疑如果你有足够的相同长度的前缀,它会快得多。请注意,如果switch语句没有太多可能的情况,它实际上不会被编译为真正的switch语句,而是一系列if/else块,这将导致它相当慢。不过,您应该对此做一些修改,看看会得到什么;添加一些虚假的case [wrongprefix]: return false;语句可能是值得的,因为信不信由你,它们实际上可以加快速度。

实际上,从SE7开始,switch语句可以与字符串一起使用。我不确定这有多有效,但这是一种选择。

或者,如果你在使用SE7之前的东西,你可以尝试...

选项3(如何作弊)

实际上,您可以将基数传递给parseInt,这意味着如果您的前缀中有字母,但它们不区分大小写,则可以使用Integer.parseInt(input.substring(0,4),36)来获取一个有效的整数值,然后可以将其与switch一起使用。

票数 2
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16331746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档