我有一组元素,它们是前缀。我必须以这样的方式编写一个Java方法,即每当它获得输入时,验证它所属的前缀,如果它与任何前缀匹配,则返回true或false。元素包括
1900
1901
1902
1903
17082输入将是
1900123445
1901334455
1800777777
...我可以使用哪种数据结构,这样它就不会影响性能。因为一次输入的数字将会达到5000万。
有人能在这方面帮我吗?提前谢谢。
发布于 2013-05-02 14:34:28
如果可能,测试这些方法中的每一种,看看哪种方法在上下文中最快。这可能取决于各种因素,我不能真正预测哪一个在您的特定用例中工作得最好。
选项0(如果前缀很少,请使用此选项)
最简单的选择是:将您的前缀存储在一个链表中,并使用input.startsWith(prefix)检查每个前缀。很无聊。
选项1(如果有非数字前缀,则使用此选项)
设k为最小前缀长度。使用HashMap,其中keys是每个前缀的first ,items是链接列表,包含每个前缀的其余部分。
例如,假设您有前缀abcd、abce和xyz。然后,您将存储以下内容:
"abc"-->("d","e"),,其中("d","e")是包含元素"d"和"e""xyz"-->("") (其中""是空字符串)的链表。将此地图称为prefixes,并使用以下代码来判断前缀是否正确:
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
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一起使用。
https://stackoverflow.com/questions/16331746
复制相似问题