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)块。这是通用的吗