下面是我自己写的一个股票凑合交易的算法。。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?希望哪位大虾帮忙指点下!
//组拼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?希望哪位大虾帮忙指点下!
//组拼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;
}
}
没有break! 我想不明白为什么return false之后 没有break?
才看见你的sb(...)方法里面存在递归调用sb(...)。你的return false可能是在内部递归中间执行的所以没有马上break。