下面是我自己写的一个股票凑合交易的算法。。public void improviseTest() {
//组拼Sharesale实体
LinkedHashMap<String, String> orderByCondition1 = new LinkedHashMap<String, String>();
orderByCondition1.put("shareprice", "asc");
orderByCondition1.put("sharesaledate", "asc");
List<Sharesale> sharesaleList=sharesaleService.getQueryResult("o.sharenum>?",
new Object[]{new Long(0)},orderByCondition1).getResultlist(); 
for(Sharesale sharesale : sharesaleList){
System.out.println("------------sale------"+sharesale.getSharenum()
+"-----------name-------"+sharesale.getShareholder().getRealname());
}
//组拼Sharebuy实体
LinkedHashMap<String, String> orderByCondition2 = new LinkedHashMap<String, String>();
orderByCondition2.put("shareprice", "desc");
orderByCondition2.put("sharebuydate", "desc");
List<Sharebuy> sharebuyList=sharebuyService.getQueryResult("o.sharenum>?",
new Object[]{new Long(0)},orderByCondition2).getResultlist();

for(Sharebuy sharebuy : sharebuyList){
System.out.println("-----------buy---------"+sharebuy.getSharenum()
+"-----------name----------"+sharebuy.getShareholder().getRealname());
}
//***************************************
if(sharebuyList.isEmpty()||sharesaleList.isEmpty()){
System.out.println("未有交易");
}else{
int length = sharebuyList.size()>sharesaleList.size()?sharebuyList.size():sharesaleList.size();

for(int i=0; i<length; i++){
Sharebuy sharebuy=sharebuyList.get(i);
Sharesale sharesale=sharesaleList.get(i);
System.out.println(i+"                      ");
boolean bool=sb(sharebuyList, sharesaleList, i, sharebuy, sharesale);
if(bool==false){
System.out.println(bool);
List<Shareimprovise> shareimproviseList=shareimproviseService.getQueryResult().getResultlist();
long improviseprice=(sharebuyList.get(i).getShareprice()+
sharesaleList.get(i).getShareprice())/2;
shareimproviseService.batchUpdatePrice(shareimproviseList, improviseprice);
System.out.println("最高买入价==============="+sharebuyList.get(i).getShareprice());
System.out.println("最低卖出价==============="+sharesaleList.get(i).getShareprice());
break;
}

//} 
}
}

}private boolean sb(List<Sharebuy> sharebuyList, List<Sharesale> sharesaleList, int i, 
Sharebuy sharebuy, Sharesale sharesale){
long maxprice = 0;
long minprice = 0;
if(i>=sharebuyList.size()){
return false;
}
System.out.println("i---------------------------------------"+i);
if(sharebuy.getSharenum()>=sharesale.getSharenum()){
if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
return false;
}
long a = sharesale.getSharenum();
sharebuy.setSharenum(sharebuy.getSharenum()-sharesale.getSharenum());
sharesale.setSharenum(0);
minprice = sharebuy.getShareprice();
maxprice = sharesale.getShareprice();
System.out.println(sharebuy.getShareholder().getUsername()+"买进"+sharesale.getShareholder().getUsername()+"         "+a+"股");
if(sharebuy.getSharenum()!=0){
if((i+1)<sharesaleList.size())
sharesale=sharesaleList.get(i+1);
else
return false;
if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
return false;
}else
sb(sharebuyList, sharesaleList, (i+1), sharebuy, sharesale);
}else{
if((i+1)<sharebuyList.size()){
sharebuy=sharebuyList.get(i+1);
}
else{
return false;
}
if((i+1)<sharesaleList.size()){
sharesale=sharesaleList.get(i+1);
}
else{
return false;
}
if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
System.out.println("--------------------------------"+sharebuy.getShareprice());
System.out.println("--------------------------------"+sharesale.getShareprice());
return false;
}else{
sb(sharebuyList, sharesaleList, (i+1), sharebuy, sharesale);
}

}
}else{
if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
return false;
}
long b = sharebuy.getSharenum();
sharesale.setSharenum(sharesale.getSharenum()-sharebuy.getSharenum());
sharebuy.setSharenum(0);
minprice = sharebuy.getShareprice();
maxprice = sharesale.getShareprice();
System.out.println(sharebuy.getShareholder().getUsername()+"买进"+sharesale.getShareholder().getUsername()+"        "+b+"股");
if(sharesale.getSharenum()!=0){
if((i+1)<sharebuyList.size())
sharebuy=sharebuyList.get(i+1);
else
return false;
if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
return false;
}else
sb(sharebuyList, sharesaleList, (i+1), sharebuy, sharesale);
}else{
if((i+1)<sharebuyList.size())
sharebuy=sharebuyList.get(i+1);
else
return false;
if((i+1)<sharesaleList.size())
sharesale=sharesaleList.get(i+1);
else
return false;
if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
return false;
}else
sb(sharebuyList, sharesaleList, (i+1), sharebuy, sharesale);
}

}
return true;
}
}输出结果如下:
输出结果:
0                      
i---------------------------------------0
B1买进A4         10000股
i---------------------------------------1
B2买进A3         10000股
--------------------------------2
--------------------------------4
1                      
i---------------------------------------1
B2买进A3         0股
--------------------------------2
--------------------------------4
false
最高买入价===============3
最低卖出价===============3问题:
在输出
--------------------------------2
--------------------------------4处 我已经return false!为什么在测试方法中没有break?希望哪位大虾帮忙指点下!

解决方案 »

  1.   

    格式化下:public void improviseTest() {
    //组拼Sharesale实体
    LinkedHashMap<String, String> orderByCondition1 = new LinkedHashMap<String, String>();
    orderByCondition1.put("shareprice", "asc");
    orderByCondition1.put("sharesaledate", "asc");
    List<Sharesale> sharesaleList=sharesaleService.getQueryResult("o.sharenum>?",
    new Object[]{new Long(0)},orderByCondition1).getResultlist();  
    for(Sharesale sharesale : sharesaleList){
    System.out.println("------------sale------"+sharesale.getSharenum()
    +"-----------name-------"+sharesale.getShareholder().getRealname());
    }
    //组拼Sharebuy实体
    LinkedHashMap<String, String> orderByCondition2 = new LinkedHashMap<String, String>();
    orderByCondition2.put("shareprice", "desc");
    orderByCondition2.put("sharebuydate", "desc");
    List<Sharebuy> sharebuyList=sharebuyService.getQueryResult("o.sharenum>?",
    new Object[]{new Long(0)},orderByCondition2).getResultlist();for(Sharebuy sharebuy : sharebuyList){
    System.out.println("-----------buy---------"+sharebuy.getSharenum()
    +"-----------name----------"+sharebuy.getShareholder().getRealname());
    }
    //***************************************
    if(sharebuyList.isEmpty()||sharesaleList.isEmpty()){
    System.out.println("未有交易");
    }else{
    int length = sharebuyList.size()>sharesaleList.size()?sharebuyList.size():sharesaleList.size();for(int i=0; i<length; i++){
    Sharebuy sharebuy=sharebuyList.get(i);
    Sharesale sharesale=sharesaleList.get(i);
    System.out.println(i+" ");
    boolean bool=sb(sharebuyList, sharesaleList, i, sharebuy, sharesale);
    if(bool==false){
    System.out.println(bool);
    List<Shareimprovise> shareimproviseList=shareimproviseService.getQueryResult().getResultlist();
    long improviseprice=(sharebuyList.get(i).getShareprice()+
    sharesaleList.get(i).getShareprice())/2;
    shareimproviseService.batchUpdatePrice(shareimproviseList, improviseprice);
    System.out.println("最高买入价==============="+sharebuyList.get(i).getShareprice());
    System.out.println("最低卖出价==============="+sharesaleList.get(i).getShareprice());
    break;
    }//}  
    }
    }}private boolean sb(List<Sharebuy> sharebuyList, List<Sharesale> sharesaleList, int i,  
    Sharebuy sharebuy, Sharesale sharesale){
    long maxprice = 0;
    long minprice = 0;
    if(i>=sharebuyList.size()){
    return false;
    }
    System.out.println("i---------------------------------------"+i);
    if(sharebuy.getSharenum()>=sharesale.getSharenum()){
    if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
    return false;
    }
    long a = sharesale.getSharenum();
    sharebuy.setSharenum(sharebuy.getSharenum()-sharesale.getSharenum());
    sharesale.setSharenum(0);
    minprice = sharebuy.getShareprice();
    maxprice = sharesale.getShareprice();
    System.out.println(sharebuy.getShareholder().getUsername()+"买进"+sharesale.getShareholder().getUsername()+" "+a+"股");
    if(sharebuy.getSharenum()!=0){
    if((i+1)<sharesaleList.size())
    sharesale=sharesaleList.get(i+1);
    else
    return false;
    if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
    return false;
    }else
    sb(sharebuyList, sharesaleList, (i+1), sharebuy, sharesale);
    }else{
    if((i+1)<sharebuyList.size()){
    sharebuy=sharebuyList.get(i+1);
    }
    else{
    return false;
    }
    if((i+1)<sharesaleList.size()){
    sharesale=sharesaleList.get(i+1);
    }
    else{
    return false;
    }
    if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
    System.out.println("--------------------------------"+sharebuy.getShareprice());
    System.out.println("--------------------------------"+sharesale.getShareprice());
    return false; }else{
    sb(sharebuyList, sharesaleList, (i+1), sharebuy, sharesale);
    }}
    }else{
    if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
    return false;
    }
    long b = sharebuy.getSharenum();
    sharesale.setSharenum(sharesale.getSharenum()-sharebuy.getSharenum());
    sharebuy.setSharenum(0);
    minprice = sharebuy.getShareprice();
    maxprice = sharesale.getShareprice();
    System.out.println(sharebuy.getShareholder().getUsername()+"买进"+sharesale.getShareholder().getUsername()+" "+b+"股");
    if(sharesale.getSharenum()!=0){
    if((i+1)<sharebuyList.size())
    sharebuy=sharebuyList.get(i+1);
    else
    return false;
    if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
    return false;
    }else
    sb(sharebuyList, sharesaleList, (i+1), sharebuy, sharesale);
    }else{
    if((i+1)<sharebuyList.size())
    sharebuy=sharebuyList.get(i+1);
    else
    return false;
    if((i+1)<sharesaleList.size())
    sharesale=sharesaleList.get(i+1);
    else
    return false;
    if(!(sharebuy.getShareprice()>=sharesale.getShareprice())){
    return false;
    }else
    sb(sharebuyList, sharesaleList, (i+1), sharebuy, sharesale);
    }}
    return true;
    }
    }
      

  2.   

    你的接下来的两个输出是在break之前的。建议你把for的i的值打出来就知道到底有没有break了
      

  3.   


    没有break! 我想不明白为什么return false之后 没有break?
      

  4.   


    才看见你的sb(...)方法里面存在递归调用sb(...)。你的return false可能是在内部递归中间执行的所以没有马上break。