【问题标题】:How to organize 3 nested loops in java?如何在java中组织3个嵌套循环?
【发布时间】:2016-04-26 09:13:44
【问题描述】:

这是我的循环结构。

int k = 0;
do {
    ....                        

    do {
        fc = Recognize();
        ....
        do {
            ....
        } while(fc != false);

        k++;
    } while(k != 20);

    if (k == 20) {
        return;
    }
} while(true);

k 等于 20 或 fc 等于 true 时,我需要结束所有循环。
我尝试了不同的方法来做到这一点,但失败了。上面的代码是我最后一次尝试。需要帮助来解决这个问题。

   grabber.start();
   int k=0;
   do {   
     grabber.stop();
     grabber.start();

     img = grabber.grab();
     if (img != null) {
       canvas.showImage(img);
       canvas.pack();
       cvWaitKey(0);
     }
     do {  
       fc=  Recognize();
       grabber.start();
       do {
         img = grabber.grab();
         if (img != null) {
            CvHaarClassifierCascade cascade = new 
            CvHaarClassifierCascade(cvLoad(XML_FILE));
            CvMemStorage storage = CvMemStorage.create();
            CvSeq sign = cvHaarDetectObjects(img,
              cascade,storage, 1.5, 3,CV_HAAR_DO_CANNY_PRUNING);

            cvClearMemStorage(storage);
            total_Faces = sign.total();     

            for(int i = 0; i < total_Faces; i++){
              CvRect r = new CvRect(cvGetSeqElem(sign, i));
              cvRectangle (img,
                cvPoint(r.x(),r.y()),
                cvPoint(r.width()+r.x(),r.height()+ r.y()),
                CvScalar.RED,2,CV_AA,0);

                x=r.x();
                y=r.y();
                h=r.height();
                w=r.width();
              }         

              cvFlip(img, img, 1);
              canvas.showImage(img);
              canvas.pack();
              cvWaitKey(0);
           }
         } while(fc!=false);

         k++;    
       }  while(k!=21);  
     } while(true);  
  }

【问题讨论】:

  • 如果我没看错的话,你目前有一个无限循环。你初始化int k = 20;,然后当你在第二级do你有k++和检查你检查while(k != 20);的同一个do-while-loop此时k是21,并且它一直在上升,所以它永远不会在你发布的code-sn-p中留下这个do-while循环..
  • @Kevin Cruijssen 。 k=0;在我的代码中。我写帖子的时候弄错了。
  • 仍然很混乱...这段代码是做什么的?您正在抓取图像并显示它,如果它不为空,那么您会进行一些“识别”并抓取另一个(?)图像。如果后一个图像不为空,您对其进行一些分析,如果您找到一些东西,您会在您找到的每个对象上放置一个矩形?用语言解释你想做什么。
  • @ГринюкАндрей 我大概花了 10 分钟才让格式以某种方式正确。不幸的是,看到所有代码......很清楚,它需要 extensive 量来进行“干净的重写”。并且无法在重构时运行任何测试……我想我无法兑现我的“承诺”——你必须自己解决这个烂摊子。我的个人提示:扔掉它;并开始做 TDD。编写测试用例,逐步实现需要实现的东西。即使在今天修复现有代码时,也无法进行测试和维护工作。
  • @Jägermeister “干净重写”是什么意思?这段代码现在工作正常。我只需要在 fc==true 或 k==21 之后打破所有循环。尝试标记第一个循环,但它不起作用。

标签: java loops do-while


【解决方案1】:

简短回答:不要那样做。

查看 Robert Martin 的 Clean code;并理解和应用single layer of abstraction 原则。

各种工具通过特别寻找这种嵌套结构来衡量“代码复杂性”是有充分理由的。

据我了解,许多具有“数学”背景的人认为计算机程序类似于“数学”结构是可以的。但是好吧:那是错误的。计算机程序是编写的……供人类阅读。当你阅读一段源代码时,最重要的是:你需要多长时间才能理解发生了什么。

我向你保证,无论你如何在一个循环中构建一个循环;从现在开始的一周内,您将很难理解正在发生的事情。因此,值得坐下一个小时或更长时间以提出更好的解决方案。不幸的是,您的示例并未显示您要解决的真正问题;因此,很难就您的情况给出具体的建议。

【讨论】:

  • 这个答案是通用的,并没有解决这个问题,它确实有一个简单而具体的答案。此外,它是一种过度概括。我强烈不同意嵌套循环本质上是不好的事实。
  • @Jägermeister 好的。这是一个完整的代码。你的解决方案是什么?
  • @Nico 当你在路上遇到一个盲人,他问你“路上有卡车吗?”任何你回答“不”的人;这将是对特定问题的特定答案。但是当盲人决定走在街上时,被一辆特斯拉汽车碾过……那个正确的、具体的答案是不是太有帮助了?!我的意思是:this 代码太复杂了。而仅仅 code 结构可能会隐藏更多的错误。也许有些地方接受了循环中的循环;美好的。但是我有太多这样的错误代码,无法让它通过。
  • @Jägermeister 告诉盲人不要再过马路也不是很有帮助
  • @Nico 当然。但实际上,我并没有告诉他永远不要过马路。我建议退后一步,考虑一个他以前没有听说过的选项。
【解决方案2】:

while(k!=21 &amp;&amp; fc){...} 就够了。或do {...} while(k!=21 &amp;&amp; fc); 如果需要。最外面的循环和中间的一些ifs一样没用。

【讨论】:

    【解决方案3】:

    唯一需要编写的循环是

    int k = 0;
    do {
          fc = Recognize();
          k++  ;
       } while(k!=20 || fc );
    

    【讨论】:

    • 我需要代码的不同部分执行的次数不相等。这就是为什么我需要 3 个循环。
    • 这个要求在实际问题中没有指定。没有理由投反对票。
    • @Nayan Sonthalia 。我现在指定了。投反对票的不是我。
    猜你喜欢
    • 2022-01-07
    • 2021-10-17
    • 2021-11-24
    • 1970-01-01
    • 2021-12-04
    • 2023-03-22
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多