0

我想知道是否有比使用这个中断实现更好的选择。我正在努力提高我的能力,以下确实有效。只是我不断听到有关 Break 的消息;作为一种简单的出路,并产生潜在的意大利面条代码,这在这里还没有发生,但仍然存在。

public void getWoodSoldRecently(){
    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.WEEK_OF_YEAR, -2);
    for(Tree t : theTrees){
        if(t.getSimpleDateSold().getTime().after(cal.getTime()) && t.getHasBeenSold()==true){
            treesSold.add(t);
            System.out.println(t.getTreeId() + " " + t.getTreeType());
        }
        else{
            System.out.println("Nothing sold in the last 2 weeks");
            break; //Stop the above
        }
    }
}

如果没有中断,“过去 2 周内没有售出”将输出存储在数组中的数量。

4

6 回答 6

6

我怀疑你实际上并不想在这里休息。当然,您只想继续使用其余的树 - 仅仅因为您发现一棵与您的状况不符的树(例如,它没有被出售),这是否真的意味着您以后不会有任何匹配的树收藏?

无论如何,您的方法显然很奇怪,因为它是get一种不返回任何内容但将值添加到现有集合的方法。这是我要改变的第一件事。

于 2012-11-08T18:05:07.217 回答
1

既然你在休息后什么都不做,如果它发生的话。您也可以将其替换为 return。

public void getWoodSoldRecently(){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.WEEK_OF_YEAR, -2);
for(Tree t : theTrees){
    if(t.getSimpleDateSold().getTime().after(cal.getTime()) && t.getHasBeenSold()==true){
        treesSold.add(t);
        System.out.println(t.getTreeId() + " " + t.getTreeType());
    }
    else{
        System.out.println("Nothing sold in the last 2 weeks");
        return; //Exit function
    }
}

}

我个人对中断没有问题,但是 return 迫使你将代码封装成更多的函数,这总是好的。

于 2012-11-08T18:05:00.167 回答
0

根据定义,Break 并不坏——它可以被滥用,但你使用它的方式是允许的。你可以考虑用return代替break。

于 2012-11-08T18:04:14.707 回答
0

我不会break在您的示例中使用此方法会导致任何问题。仍然发布一种可能的解决方法(避免中断):

   boolean bContinue = true;
   int iSize = theTrees.size();
   for(int indx=0; indx < iSize && bContinue; indx++){
    Tree t  = theTrees.get(indx);
    if(t.getSimpleDateSold().getTime().after(cal.getTime()) 
        && t.getHasBeenSold()==true){
        treesSold.add(t);
        System.out.println(t.getTreeId() + " " + t.getTreeType());
    }
    else{
        System.out.println("Nothing sold in the last 2 weeks");
        bContinue = false;//This will stop the loop
    }
}
于 2012-11-08T18:04:35.190 回答
0

问题是您使用的 foreach 循环不允许您使用条件参数。如果你将它转换成一个 for 循环,你会更好:

boolean loopContinue = true;

for(int i = 0; i < theTrees.size() && loopContinue; i++) {
        Tree t = theTrees.get(i);
        if(t.getSimpleDateSold().getTime().after(cal.getTime()) && t.getHasBeenSold()==true){
            treesSold.add(t);
            System.out.println(t.getTreeId() + " " + t.getTreeType());
        }
        else{
            System.out.println("Nothing sold in the last 2 weeks");
            loopContinue = false; //Stop the above
        }
    }
}

编辑和澄清:我说“更好”意味着您将更好地控制您的循环。正如其他人所说,使用break本质上并不坏。

于 2012-11-08T18:06:42.597 回答
-1

使用迭代器:

public void getWoodSoldRecently(){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.WEEK_OF_YEAR, -2);
Iterator itr = theTrees.iterator();
boolen b = true;
while (itr.hasNext() && b == true) {
        if(t.getSimpleDateSold().getTime().after(cal.getTime()) && t.getHasBeenSold()==true){
            treesSold.add(t);
            System.out.println(t.getTreeId() + " " + t.getTreeType());
        }
        else{
            System.out.println("Nothing sold in the last 2 weeks");
            b = false;
        }
    }
}
于 2012-11-08T18:11:44.477 回答