gpt4 book ai didi

java - 如何优化 Java 和流 vector 中的 3D xyz 嵌套循环?

转载 作者:行者123 更新时间:2023-12-01 19:26:31 25 4
gpt4 key购买 nike

我为 Minecraft 编写插件,经常遇到这样的情况:我必须循环遍历 3 维空间中的每个 block ,以某种方式处理该 block 。例如:

for (int x = minX; x <= maxX; x++) {
for (int y = minY; y <= maxY; y++) {
for (int z = minZ; z <= maxZ; z++) {
// Do something
}
}
}

这种循环发生了很多,我突然意识到也许有更好的方法可以使代码更简洁,但执行速度仍然一样快。我真正想做的就是循环遍历 3 维类型中的每个坐标。

Bukkit API 有这样一种类型 - 一个可以保存 x、y、z 的 Vector 类。 Vector 类具有返回整数的方法,例如 getBlockXgetBlockYgetBlockZ。所以,我正在考虑创建一个像这样的实用方法:

Stream<Vector> getXYZStream(minVector, maxVector)

这将返回给定最小和最大 vector 之间的所有 vector (x,y,z) 值的流。那么我可以这样做:

getXYZStream(minVector, maxVector).forEach(v -> doSomething);

在这方面我如何制作 vector 流?如果我可以编写这种方法的代码,那么我将测量性能差异并看看它是否有意义。

或者有更好的方法吗?

或者我应该接受这些循环是必要的并且是最好的方法吗?

最佳答案

我发现了一种可以使用自定义迭代器创建流的方法,因此可以执行如下操作:

    public Stream<Vector> get3dStream(Vector minVector, Vector maxVector) {
Iterator<Vector> it = new CustomIterator(minVector, maxVector);
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.DISTINCT), false);
}

class CustomIterator implements Iterator<Vector> {

private Vector minVector;
private Vector maxVector;

BoundingBox b = new BoundingBox();

// constructor
CustomIterator(Vector minVector, Vector maxVector) {
// initialize cursor
this.minVector = minVector;
this.maxVector = maxVector.add(new Vector(1,1,1));
}

// Checks if the next element exists
@Override
public boolean hasNext() {
return !minVector.equals(maxVector);
}

// moves the cursor/iterator to next element
@Override
public Vector next() {
Vector r = minVector;
increment();
return r;
}

private void increment() {
// Increment the vector - this takes a lot of code to do
}

}

但是,正如您所看到的,在自定义迭代器中跟踪 next() 将需要相当多的代码,并且与三个 for 循环相比要复杂得多,并且可能会更慢。我同意 kaya3 的评论,它可以隐藏一些循环,但不会更快,这是 100% 的要求。

关于java - 如何优化 Java 和流 vector 中的 3D xyz 嵌套循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59308952/

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