gpt4 book ai didi

java - 字符串拆分和比较 - 最快的方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:12:15 26 4
gpt4 key购买 nike

我有一个像这样的字符串:

1,2,3:3,4,5

分隔符左侧的字符串需要与分隔符右侧的字符串(:)进行比较。现在,当我说比较时,我实际上是要查找右侧部分 (3,4,5) 中的元素是否存在于左侧部分 (1,2,3) 中)。正确的部分可以包含重复项,这很好(显然意味着我不能使用 HashSet)。我已经完成了这项工作(详情如下),但我需要最快的方法来拆分和比较上述字符串。

这纯粹是一个基于性能的问题,用于找出哪种方法可以更快,因为我将使用的实际输入是巨大的(在任何一方)。只有一行,它将通过 stdin 读取。

我是如何做到这一点的:

  1. 阅读标准输入
  2. 使用 string.split 拆分并将左侧部分存储在 HashSet 中。
  3. 将正确的部分存储在 ArrayList 中。
  4. 遍历数组列表,使用 contains() 检查元素是否存在于 HashSet 中。

最佳答案

  1. 将输入读入 byte[] 数组以将指针保存在代码的一侧。

  2. 逐字节读取,途中计算整数元素:

    int b = inputBytes[p++];
    int d = b - '0';
    if (0 <= d) {
    if (d <= 9) {
    element = element * 10 + d;
    } else {
    // b == ':'
    }
    } else {
    // b == ','
    // add element to the hash; element = 0;
    ...
    }
    if (p == inputBytesLength) {
    inputBytesLength = in.read(inputBytes);
    if (inputBytesLength == 0) { ... }
    p = 0;
    }
  3. 使用int[],长度为2的足够大的幂作为散列:

    // as add()
    int h = element * 0x9E3779B9;
    int i = h >>> (32 - hashSizePower);
    while (hash[i] != 0) {
    if (--i < 0) i += hashSize;
    }
    hash[i] = element;

    // contains() similarly

关于java - 字符串拆分和比较 - 最快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20036407/

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