Java 迭代相同类型的所有连接块
我有一个事件,当用指南针右键单击时,会将Java 迭代相同类型的所有连接块,java,iterator,minecraft,bukkit,Java,Iterator,Minecraft,Bukkit,我有一个事件,当用指南针右键单击时,会将块添加到哈希集。但是,我希望将连接到第一个块的相同类型的所有块添加到集合中。我应该如何做才能防止延迟?首先,您要创建一个块面数组,它表示块的所有6个边。(前面、后面、左边、右边、上面和下面) 接下来,创建一个私有方法,该方法遍历所有这些块面,检查该侧的块是否为同一类型,并将这些块添加到有待检查的块列表中。稍后我们将使用此列表 在此方法中,results是连接到使用指南针单击的块的所有块的集合,todo是尚未以相同方式检查的块的列表 private void
块
添加到哈希集
。但是,我希望将连接到第一个块的相同类型的所有块添加到集合中。我应该如何做才能防止延迟?首先,您要创建一个块面
数组,它表示块的所有6个边。(前面、后面、左边、右边、上面和下面)
接下来,创建一个私有方法,该方法遍历所有这些块面,检查该侧的块是否为同一类型,并将这些块添加到有待检查的块列表中。稍后我们将使用此列表
在此方法中,results
是连接到使用指南针单击的块的所有块的集合,todo
是尚未以相同方式检查的块的列表
private void getConnectedblocks(Block block, Set<Block> results, List<Block> todo) {
//Here I collect all blocks that are directly connected to variable 'block'.
//(Shouldn't be more than 6, because a block has 6 sides)
Set<Block> result = results;
//Loop through all block faces (All 6 sides around the block)
for(BlockFace face : faces) {
Block b = block.getRelative(face);
//Check if they're both of the same type
if(b.getType() == block.getType()) {
//Add the block if it wasn't added already
if(result.add(b)) {
//Add this block to the list of blocks that are yet to be done.
todo.add(b);
}
}
}
private void getConnectedblocks(块块、设置结果、列表待办事项){
//这里我收集所有直接连接到变量“block”的块。
//(不应超过6条,因为一个块有6条边)
设置结果=结果;
//循环通过所有块面(块周围的所有6条边)
用于(块面:面){
块b=块.getRelative(面);
//检查它们是否属于同一类型
if(b.getType()==block.getType()){
//如果尚未添加块,请添加该块
如果(结果加上(b)){
//将此块添加到尚未完成的块列表中。
待办事项.加入(b);
}
}
}
最后,使用下面的方法遍历所有有待检查的块,并为所有这些块调用上面的私有方法。这是我能想到的最有效的方法
public Set<Block> getConnectedblocks(Block block) {
Set<Block> set = new HashSet<>();
LinkedList<Block> list = new LinkedList<>();
//Add the current block to the list of blocks that are yet to be done
list.add(block);
//Execute this method for each block in the 'todo' list
while((block = list.poll()) != null) {
getConnectedblocks(block, set, list);
}
return set;
}
public Set getConnectedblocks(块){
Set=newhashset();
LinkedList=新建LinkedList();
//将当前块添加到尚未完成的块列表中
列表。添加(块);
//对“todo”列表中的每个块执行此方法
而((block=list.poll())!=null){
getConnectedblocks(块、集、列表);
}
返回集;
}
请注意,您不能在异步线程上运行这些方法,因为这可能会导致
CurrentModificationException
,这可能会导致游戏本身出现奇怪的行为,具体取决于您使用它的目的。首先,您制作一个块面
数组,它表示块的所有6个面。(前面、后面、左边、右边、上面和下面)
接下来,创建一个私有方法,该方法遍历所有这些块面,检查该侧的块是否属于同一类型,并将这些块添加到待检查的块列表中。我们稍后将使用此列表
在此方法中,results
是连接到使用指南针单击的块的所有块的集合,todo
是尚未以相同方式检查的块的列表
private void getConnectedblocks(Block block, Set<Block> results, List<Block> todo) {
//Here I collect all blocks that are directly connected to variable 'block'.
//(Shouldn't be more than 6, because a block has 6 sides)
Set<Block> result = results;
//Loop through all block faces (All 6 sides around the block)
for(BlockFace face : faces) {
Block b = block.getRelative(face);
//Check if they're both of the same type
if(b.getType() == block.getType()) {
//Add the block if it wasn't added already
if(result.add(b)) {
//Add this block to the list of blocks that are yet to be done.
todo.add(b);
}
}
}
private void getConnectedblocks(块块、设置结果、列表待办事项){
//这里我收集所有直接连接到变量“block”的块。
//(不应超过6条,因为一个块有6条边)
设置结果=结果;
//循环通过所有块面(块周围的所有6条边)
用于(块面:面){
块b=块.getRelative(面);
//检查它们是否属于同一类型
if(b.getType()==block.getType()){
//如果尚未添加块,请添加该块
如果(结果加上(b)){
//将此块添加到尚未完成的块列表中。
待办事项.加入(b);
}
}
}
最后,使用下面的方法遍历所有有待检查的块,并为所有这些块调用上面的私有方法。这是我能想到的最有效的方法
public Set<Block> getConnectedblocks(Block block) {
Set<Block> set = new HashSet<>();
LinkedList<Block> list = new LinkedList<>();
//Add the current block to the list of blocks that are yet to be done
list.add(block);
//Execute this method for each block in the 'todo' list
while((block = list.poll()) != null) {
getConnectedblocks(block, set, list);
}
return set;
}
public Set getConnectedblocks(块){
Set=newhashset();
LinkedList=新建LinkedList();
//将当前块添加到尚未完成的块列表中
列表。添加(块);
//对“todo”列表中的每个块执行此方法
而((block=list.poll())!=null){
getConnectedblocks(块、集、列表);
}
返回集;
}
请注意,您不能在异步线程上运行这些方法,因为这可能会导致
CurrentModificationException
,并且这可能会导致游戏本身出现奇怪的行为,具体取决于您使用它的目的。block类包含我需要的坐标。位置具有浮点坐标和方向。当您编写“所有街区……连接到第一个街区”你是指与街区相邻的六个街区(基本方向、上下方向)还是其他什么?一些澄清可能会有所帮助“可以指各种各样的东西。所谓连接,我指的是在同一组中。任何与…接触原始块的块接触的块。块类包含我需要的坐标。位置有浮动坐标和方向。当你写“所有块…连接到第一个块”时,你是指六个块吗(基本方向,上下)邻近一个街区或其他地方?一些澄清可能会有帮助,“连通”可以指各种各样的东西。我所说的连通是指在同一个组中。任何与……接触原始街区的街区。这是否会将所有街区都包含在同一个“组”中?如果我有一个8x8x8的纯金立方体,todo
将包含所有8^3个块?@moo\u我们所有人\u很抱歉,我忘了包含最后一个方法。不,todo
不包含所有块,只包含尚未检查的块。公共方法的结果getConnectedblocks(Block Block)
包含所有块(在你的例子中,所有的8^3)块。这是通用的吗