没有休息的循环更好;

时间:2012-11-08 18:00:59

标签: java if-statement for-loop break

我想知道是否有更好的选择,然后使用这个中断实现。我正在努力提高自己的能力,以下确实有效。只是我一直听说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
        }
    }
}

如果没有中断,“过去两周内没有出售任何东西”将输出存储在数组中的金额。

6 个答案:

答案 0 :(得分:6)

我怀疑你实际上并不打算在这里打破。当然你只想继续使用剩下的树 - 只是因为你发现一个树与你的条件不符(例如它没有被出售),这是否真的意味着不能在你的收藏中稍后会有任何匹配的东西吗?

无论如何,你的方法显然是奇怪的,因为get方法不会返回任何东西,而是为现有集合添加值。 那是我要改变的第一件事。

答案 1 :(得分: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
    }
}

}

我个人没有休息的问题,但是返回会迫使你将代码封装到更多的函数中,总是好。

答案 2 :(得分:0)

根据定义,中断也不错 - 它可能被滥用,但允许使用它的方式。 你可以考虑用回报代替休息。

答案 3 :(得分: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
    }
}

答案 4 :(得分: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
        }
    }
}

EDIT&amp;澄清:我说“更好”意味着你可以更好地控制你的循环。正如其他人所说,使用break本身并不是坏事。

答案 5 :(得分:-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;
        }
    }
}