gpt4 book ai didi

java - 有没有更简洁的方法来减少这个多维字节数组以删除重复项?

转载 作者:行者123 更新时间:2023-11-30 06:58:40 26 4
gpt4 key购买 nike

我正在尝试找到一种方法,从作为“new byte[][]”返回的字节数组“byte[][]”中删除重复条目。我现在拥有的代码似乎可以工作,但看起来真的很难看,我想知道是否有人知道改进它的更好技巧。我创建的函数如下所示:

private byte[][] filterByteArrayValues(final byte[][] values)
{
final ArrayList<byte[]> listOfBytes = new ArrayList<byte[]>();
final ArrayList<String> listOfCrc32 = new ArrayList<String>();
for (final byte[] value : values)
{
final String crc = this.generateCheckSum(value);
if (!listOfCrc32.contains(crc))
{
listOfCrc32.add(crc);
listOfBytes.add(value);
}
}
final byte[][] output = new byte[listOfBytes.size()][];
for (int i = 0; i < listOfBytes.size(); i++)
{
output[i] = listOfBytes.get(i);
}

return output;

}

我最大的遗憾是我如何为返回值重建'byte[][]'。我很确定有更好的方法,但我想不出。我的目标也是 JRE1.8。

最佳答案

假设您有信心您的 CRC 不会产生误报,或者您可以接受消除此类误报的后果,另一种方法是使用 HashMap :

private byte[][] filterByteArrayValues(final byte[][] values) {
final Map<String,byte[]> res = new HashMap<>();
for (final byte[] value : values) {
res.put(generateCheckSum(value), value);
}
return res.values().toArray(new byte[res.size()][]);
}

字节数组的相对顺序可能会改变,而不是你的代码生成的数组的第一个出现,你会得到最后一个。

如果您不喜欢重新排序,请使用您的方法,但替换 ArrayList<String>HashSet<String>使您的过滤成为 O(n) 而不是当前的 O(n2)。

如果您不希望出现误报,则需要围绕 byte[] 构建一些基础架构数组,使它们适合在哈希容器中使用:

class Mva { // Multi-valued attribute
private final byte[] data;
public Mva(byte[] data) { this.data = data; }
@Override
public int hashCode() {
// return CRC similar to your generateCheckSum
}
@Override
public boolean equals(Object other) {
// Cast other to Mva, and compare individual values in data[]
}
}

现在您可以使用 LinkedHashSet<Mva> 在保持相对顺序的同时消除重复项,并且没有消除误报的风险。

关于java - 有没有更简洁的方法来减少这个多维字节数组以删除重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32438600/

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