gpt4 book ai didi

java - Java 中的性能密集型字符串拆分和操作

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:51:27 26 4
gpt4 key购买 nike

用非常简单的分隔符分割字符串的最有效方法是什么?

一些背景:

我正在将我用 C 语言编写的带有一堆指针算法的函数移植到 Java,它非常慢(经过一些优化后仍然慢 5*)。对它进行分析后,发现很多开销都在 String.split 中

有问题的函数采用主机名或 IP 地址并使其通用:

123.123.123.123->*.123.123.123

a.b.c.example.com->*.example.com

这可能会定期运行数百万个项目,因此性能是一个问题。

编辑:转换规则如下:

  • 如果是ip地址,替换第一部分
  • 否则,找到主域名,将前面的部分做成通用的。

foo.bar.com-> *.bar.comfoo.bar.co.uk-> *.bar.co.uk

我现在已经使用 lastIndexOf 和 substring 重写了自己的工作,并且性能有了突飞猛进的提高。

我会将问题再开放 24 小时,然后再确定最佳答案以供将来引用

这是我现在想到的(ip 部分是调用此函数之前的微不足道的检查)

private static String hostConvert(String in) {
final String [] subs = { "ac", "co", "com", "or", "org", "ne", "net", "ad", "gov", "ed" };

int dotPos = in.lastIndexOf('.');
if(dotPos == -1)
return in;
int prevDotPos = in.lastIndexOf('.', dotPos-1);
if(prevDotPos == -1)
return in;
CharSequence cs = in.subSequence(prevDotPos+1, dotPos);
for(String cur : subs) {
if(cur.contentEquals(cs)) {
int start = in.lastIndexOf('.', prevDotPos-1);
if(start == -1 || start == 0)
return in;
return "*" + in.substring(start);
}
}

return "*" + in.substring(prevDotPos);
}

如果有任何进一步改进的空间,很高兴听到。

最佳答案

像这样的事情是你能做到的最快速度:

static String starOutFirst(String s) {
final int K = s.indexOf('.');
return "*" + s.substring(K);
}
static String starOutButLastTwo(String s) {
final int K = s.lastIndexOf('.', s.lastIndexOf('.') - 1);
return "*" + s.substring(K);
}

然后你可以这样做:

    System.out.println(starOutFirst("123.123.123.123"));
// prints "*.123.123.123"

System.out.println(starOutButLastTwo("a.b.c.example.com"));
// prints "*.example.com"

您可能需要使用正则表达式来查看这两种方法中的哪一种适用于任何给定的字符串。

关于java - Java 中的性能密集型字符串拆分和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2941234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com