gpt4 book ai didi

java - 如何将 MAC 字符串转换为冒号分隔的字符串

转载 作者:行者123 更新时间:2023-11-29 07:05:42 26 4
gpt4 key购买 nike

我有 20 万行的 csv 文件和 3 种类型的 MAC 地址,定义为:

  • ECE1A9312000
  • E8:6D:52:75:2D:16
  • 24-C9-A1-15-89-B0

我的目标是只使用冒号分隔的形式。

所以将 - 转换为 : 没什么大不了的:

mac = mac.replace("-", ":");

但是如何将ECE1A9312000转换为EC:E1:A9:31:20:00

我想使用正则表达式,但对如此多的数据(~80k)使用组太昂贵了。

我是否需要遍历每个 char 并附加 :

喜欢:

for(int i=0; i<mac.length(); i++){
ch = mac.charAt(i);

if(i % 2 == 0 && i != 0){
tmp += ':';
}
tmp += ch;
}

或者有更有效的方法?

谢谢,

最佳答案

我根据您丢弃的正则表达式方法拼凑了一个完全未优化的程序并对其进行了计时。它在 650 毫秒内完成(预热时为 250 毫秒)。最慢的部分不涉及正则表达式,而是 String.format。如果我们用直接的 StringBuilder 方法替换它,时间会下降到 40 毫秒。

public class Test {
static Pattern regex = Pattern.compile("(..)(..)(..)(..)(..)(..)");
public static void main(String[] args) {
final List<String> inMacs = new ArrayList<>(), outMacs = new ArrayList<>();
for (int i = 0; i < 80_000; i++) inMacs.add(mac());
final long start = System.nanoTime();
for (String mac : inMacs) {
final Matcher m = regex.matcher(mac);
m.matches();
outMacs.add(String.format("%s:%s:%s:%s:%s:%s",
m.group(1), m.group(2), m.group(3), m.group(4), m.group(5), m.group(6)));
}
System.out.println("Took " + (System.nanoTime() - start)/1_000_000 + " milliseconds");
final Iterator<String> it = outMacs.iterator();
for (int i = 0; i < 100; i++) System.out.println(it.next());
}

static Random rnd = new Random();
static String mac() {
final long mac = (long) (rnd.nextDouble()*(1L<<48));
return String.format("%012x", mac).toUpperCase();
}
}

如果您真的在寻找一个快速的解决方案,那么请避免使用正则表达式并使用一个简单的测试来检测您的 MAC 格式:

  static List<String> fixMacs(List<String> inMacs) {
final List<String> outMacs = new ArrayList<>(inMacs.size());
for (String mac : inMacs) outMacs.add(
mac.charAt(2) == '-'? mac.replace("-", ":")
: mac.charAt(2) != ':'? fixMac(mac)
: mac);
return outMacs;
}

static String fixMac(String inMac) {
final StringBuilder b = new StringBuilder(18);
for (int i = 0; i < inMac.length(); i++) {
b.append(inMac.charAt(i));
if (i%2 == 1 && i != inMac.length()-1) b.append(':');
}
return b.toString();
}

通过这种方法,我只为您的 80,000 个 MAC 测量了 8 毫秒。

关于java - 如何将 MAC 字符串转换为冒号分隔的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20143111/

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