Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java从哈希集中查找连接的矩形_Java_Recursion - Fatal编程技术网

使用java从哈希集中查找连接的矩形

使用java从哈希集中查找连接的矩形,java,recursion,Java,Recursion,我有一个用自定义矩形对象(“名称”、中心X、中心Y、宽度、高度)填充的哈希集。我写了一个方法来确定两个矩形是否连接(接触/相交)。但是我想得到所有的矩形,它们是一个组。例如:如果rectA与rectB相连,那么RectC与rectB相连,而不是直接与rectA相连。它们都是连接的,因为rectB是公共的 我能找到有直接联系的形状。但我想得到一个组,其中还包括具有辅助连接的形状。我假设递归在这种情况下很有用,但还不能解决它。有什么解决方案/建议吗 public static void canItb

我有一个用自定义矩形对象(“名称”、中心X、中心Y、宽度、高度)填充的哈希集。我写了一个方法来确定两个矩形是否连接(接触/相交)。但是我想得到所有的矩形,它们是一个组。例如:如果rectA与rectB相连,那么RectC与rectB相连,而不是直接与rectA相连。它们都是连接的,因为rectB是公共的

我能找到有直接联系的形状。但我想得到一个组,其中还包括具有辅助连接的形状。我假设递归在这种情况下很有用,但还不能解决它。有什么解决方案/建议吗

public static void canItbeGroup(HashSet<RECTANGLE> ipRectangles)
{
    Deque<RECTANGLE> ipDeque = new ArrayDeque<>(ipRectangles);

    for (RECTANGLE currRectangle : ipDeque)
    {
        Set<String> tempGrpMbrShapeID = new HashSet<>();
        RECTANGLE tempRect = ipDeque.pop();
        for (RECTANGLE r : ipDeque)
        {
            if (tempRect.areShapesFriend(r))
            {
                tempGrpMbrShapeID.add(r.shapeID);
                tempGrpMbrShapeID.add(tempRect.shapeID);
            }
        }
        if (tempGrpMbrShapeID.size() > 1)
        {
            System.out.println(tempGrpMbrShapeID);
        }
    }
}

public static void main(String[] args)
{
    HashSet<RECTANGLE> rectHS = new HashSet<>();

    RECTANGLE aRect = new RECTANGLE("a", 3, 2, 2, 2);
    RECTANGLE aInnerRect = new RECTANGLE("aIn", 3, 2, 1, 1);
    RECTANGLE bRect = new RECTANGLE("b", 5, 3, 2, 2);
    RECTANGLE cRect = new RECTANGLE("c", 7, 3, 2, 2);
    RECTANGLE dRect = new RECTANGLE("d", 4, 5, 4, 2);
    RECTANGLE eRect = new RECTANGLE("e", 11, 3, 2, 2);
    RECTANGLE fRect = new RECTANGLE("f", 11, 6, 2, 2);
    RECTANGLE gRect = new RECTANGLE("g", 13, 3, 2, 2);
    RECTANGLE hRect = new RECTANGLE("h", 4, 8, 2, 2);
    RECTANGLE iRect = new RECTANGLE("i", 14, 1, 2, 2);
    RECTANGLE jRect = new RECTANGLE("j", 16, 7, 2, 2);
    RECTANGLE kRect = new RECTANGLE("k", 15, 6, 2, 2);
    RECTANGLE lRect = new RECTANGLE("l", 8, 8, 2, 2);
    RECTANGLE mRect = new RECTANGLE("m", 5, 10, 2, 2);


    rectHS.add(aRect);
    rectHS.add(bRect);
    rectHS.add(cRect);
    rectHS.add(eRect);
    rectHS.add(dRect);
    rectHS.add(fRect);
    rectHS.add(gRect);
    rectHS.add(aInnerRect);
    rectHS.add(hRect);
    rectHS.add(iRect);
    rectHS.add(jRect);
    rectHS.add(kRect);
    rectHS.add(lRect);
    rectDQ.add(aRect);
    rectDQ.add(bRect);
    rectDQ.add(cRect);
    rectDQ.add(dRect);
    rectDQ.add(eRect);

    canItbeGroup(rectHS);
}
我需要这群人作为我的助手

[a,b,aIn,c,d], [e,g,i], [j,k]

我不会为你解决这个问题,但我会给你一个大致的方法

  • 生成初始
    集合
    。这实际上是您已经完成的工作,但是您需要存储它们,以便合并集合,而不是在找到集合后立即打印组
  • 迭代所有组(
    i
    ),并将每个组与每个其他组进行比较(
    j
  • 如果
    i
    包含
    j
    的任何项目,则合并集合(将
    j
    的所有项目放入
    i
    ,并从
    j
    中删除所有项目)
  • 返回到2并重复,直到执行1个完整的迭代,其中没有发生合并
  • 再次迭代并删除所有空集

  • 我不会为你解决这个问题,但我会给你一个大致的方法

  • 生成初始
    集合
    。这实际上是您已经完成的工作,但是您需要存储它们,以便合并集合,而不是在找到集合后立即打印组
  • 迭代所有组(
    i
    ),并将每个组与每个其他组进行比较(
    j
  • 如果
    i
    包含
    j
    的任何项目,则合并集合(将
    j
    的所有项目放入
    i
    ,并从
    j
    中删除所有项目)
  • 返回到2并重复,直到执行1个完整的迭代,其中没有发生合并
  • 再次迭代并删除所有空集

  • 非常感谢。这起作用了。但是你能推荐任何使用递归的解决方案吗。我是递归新手,谢谢。这起作用了。但是你能推荐任何使用递归的解决方案吗。我不熟悉递归。
    [a,b,aIn,c,d], [e,g,i], [j,k]