java - 如何优化 Java 中嵌套 for 循环的 3D xyz 和流向量?
问题描述
我为 Minecraft 编写插件并且经常遇到这样的情况,即我必须循环遍历 3 维空间中的每个块以以某种方式处理该块。例如:
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 有这样一种类型——一个Vector
可以容纳 x,y,z 的类。Vector 类具有诸如getBlockX
,之类的方法getBlockY
,getBlockZ
它们返回整数。所以,我正在考虑创建一个这样的实用方法:
Stream<Vector> getXYZStream(minVector, maxVector)
这将返回给定的最小和最大向量之间的所有向量 (x,y,z) 值的流。那么我可以这样做:
getXYZStream(minVector, maxVector).forEach(v -> doSomething);
在这方面,我如何制作向量流?如果我可以对这种方法进行编码,那么我将测量性能差异并查看它是否有意义。
还是有更好的方法来做到这一点?
还是我应该接受这些循环是必要的和最好的方法?
解决方案
我找到了一种可以使用自定义迭代器制作流的方法,因此可以执行以下操作:
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% 的要求。
推荐阅读
- c# - 当我通过 EF Core 更新数据库时创建唯一索引重复键
- node.js - Node js中的Docker“清单列表条目中的windows / amd64 10.0.17134没有匹配的清单”
- flutter - 我的 Flutterproject 有问题,无法构建,这是我遇到的错误:
- django - Django不生成primary_key
- mysql - 收到值问题,空对象 Axios/Post/bdd ReactJS
- r - 根据R中列中的值删除行
- angular - 主题对 Angular 8 中的过滤数据没有反应
- html - 具有相同特异性的 CSS 标记选择器的特异性顺序
- javascript - 根据任何承诺的特定解决方案停止所有 Javascript 执行(客户端)
- visual-studio-code - 如何将自定义类型导入 vscode js 项目