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

对于以下场景,在Java中使用哪种数据结构?,java,Java,我有一组元素,它们是前缀。我必须以这样一种方式编写Java方法:每当它得到一个输入时,验证它属于哪个前缀,如果它与任何前缀匹配,则返回true或false。 元素是 1900 1901 1902 1903 17082 输入将是 1900123445 1901334455 1800777777 ... 我可以使用哪种数据结构,这样就不会影响性能。因为一次输入的数字将高达5000万 有人能帮我吗?提前感谢。如果可能的话,测试每种方法,看看哪种方法在上下文中最快。这可能取决于多种因素,我无法预测哪

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

1900
1901
1902
1903
17082
输入将是

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


有人能帮我吗?提前感谢。

如果可能的话,测试每种方法,看看哪种方法在上下文中最快。这可能取决于多种因素,我无法预测哪一种因素在您的特定用例中最有效

选项0如果前缀很少,请使用此选项 最简单的选择:将前缀存储在链接列表中,并使用input.StartWithPrefix检查每个前缀。无聊

选项1如果有非数字前缀,则使用此选项 设k为最小前缀长度。使用HashMap,其中键是每个前缀的前k位,项是包含每个前缀其余部分的链接列表

例如,假设您有前缀abcd、abce和xyz。然后您将存储以下内容:

abc->d,e,其中d,e是包含元素d和e的链表 xyz->其中是空字符串。 调用此映射前缀,并使用以下代码确定前缀是否正确:

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语句,每个可能的前缀长度对应一个语句。例如,假设前缀为1901、1902和20050:

这将是更多的代码,但我怀疑如果您有足够多的相同长度的前缀,它会更快。请注意,如果switch语句没有太多可能的情况,那么它实际上不会被编译为真正的switch语句,而是编译为一系列if/else块,这将导致它相当慢。不过,你应该在这件事上做点手脚,看看能得到什么;可能值得加入一些虚假案例[错误前缀]:返回false;因为信不信由你,它们实际上可以加速事情的发展

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

或者,如果您使用的是SE7之前的版本,您可以尝试

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

如果可能,请测试这些方法中的每一个,看看哪一个在上下文中最快。这可能取决于多种因素,我无法预测哪一种因素在您的特定用例中最有效

选项0如果前缀很少,请使用此选项 最简单的选择:将前缀存储在链接列表中,并使用input.StartWithPrefix检查每个前缀。无聊

选项1如果有非数字前缀,则使用此选项 设k为最小前缀长度。使用HashMap,其中键是每个前缀的前k位,项是包含每个前缀其余部分的链接列表

例如,假设您有前缀abcd、abce和xyz。然后您将存储以下内容:

abc->d,e,其中d,e是包含元素d和e的链表 xyz->其中是空字符串。 调用此映射前缀,并使用以下代码确定前缀是否正确:

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语句,每个可能的前缀长度对应一个语句。例如,假设前缀为1901、1902和20050:

这将是更多的代码,但我怀疑如果您有足够多的相同长度的前缀,它会更快。请注意,如果switch语句没有太多可能的情况,那么它实际上不会被编译为真正的switch语句,而是编译为一系列if/else块,这将导致它相当慢。不过,你应该在这件事上做点手脚,看看能得到什么;可能值得加入一些虚假案例[错误前缀]:返回false;因为信不信由你,它们实际上可以加速事情的发展

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

或者,如果您使用的是SE7之前的版本,您可以尝试

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

最好将前缀存储在HashMap中,并且该值应该是一个链接列表。我假设相同的前缀可以用不同的数字标记,比如19011234 190123444。

最好将前缀存储在HashMap中,值应该是一个链表。我假设相同的前缀可以用不同的数字标记,比如19011234 190123444。

前缀的长度是否相同

如果是这样,您可以对所有前缀进行散列

当您遇到新的输入时,您将提取前x位数字


如果哈希设计得很好,您将查找哈希中是否存在前x位,这是一种O1操作。

前缀的长度是否相同

如果是这样,您可以对所有前缀进行散列

当您遇到新的输入时,您将提取前x位数字


如果散列设计得好,您可以查找散列中是否存在前x位,这是一种O1操作。

如果您只有相对较小的整数,则可以使用布尔稀疏数组,其中前缀将用作索引


或者,哈希集是一个很好的选择。

如果只有相对较小的整数,可以使用一个稀疏的布尔数组,其中前缀将用作索引


或者,哈希集是一个不错的选择。

创建一个哈希集,并将这4个值添加到其中。然后解析输入值以获得前四个整数,并调用HashSet contains方法,该方法将返回true/false。

创建一个HashSet并在其中添加这四个值。然后解析输入值以获得前四个整数,并调用HashSet contains方法,该方法将返回true/false。

前缀的长度是否都相同?这听起来像是一个例子。然而,我认为JavaSEAPI中没有公共的Trie实现。我也不知道cannonical第三方实现。现在我们知道前缀可以有不同的长度,我已经编辑了我的答案。它们都是数字吗?前缀的长度都一样吗?这听起来像是一个例子。然而,我认为JavaSEAPI中没有公共的Trie实现。我也不知道cannonical第三方实现。现在我们知道前缀可以有不同的长度,我已经编辑了我的答案。都是数字吗?谢谢。。。前缀也可以有不同的长度。即使它们有不同的长度,您希望有多少不同的长度?如果只有3到4个不同的长度,那么继续使用我提到的方法可能仍然有意义。您只需将输入转换为不同的前缀长度,然后再试一次。谢谢。。。前缀也可以有不同的长度。即使它们有不同的长度,您希望有多少不同的长度?如果只有3到4个不同的长度,那么继续使用我提到的方法可能仍然有意义。您只需将输入转换为不同的前缀长度,然后重试。