在工作过程中遇到了多条记录比较分值上下限的问题,首先是用java写的比较程序如下:
if(PartnerConstants.CODE_INFO_SUP_EVA_RESULT_TYPE_SCORE.equals(supEvaResultTypeCode)
||PartnerConstants.CODE_INFO_SUP_EVA_RESULT_TYPE_LEVEL.equals(supEvaResultTypeCode)){
//按分值下线排序
sortResults(supEvaSystemResults);
boolean flag=false;
for(int i = 0;i<supEvaSystemResults.size();i++){
//分值下线
BigDecimal scoreLowerBefore = supEvaSystemResults.get(i).getScoreLower();
//分值上线
BigDecimal scoreLimitBefore = supEvaSystemResults.get(i).getScoreLimit();
for(int j=i+1;j<supEvaSystemResults.size();j++){
BigDecimal scoreLowerAfter = supEvaSystemResults.get(j).getScoreLower();
if(scoreLowerBefore.compareTo(scoreLowerAfter)==0){// 1)如果前、后两条数据 分值下线相等 则不满足条件
flag=true;
}else if(scoreLimitBefore.compareTo(scoreLowerAfter)>=0){//2)如果前一条的分值上线大于等于后一条的分值下线则不满足条件
flag=true;
}
}
}
//评分或者评级的分值范围不能交叉
if(flag)
if(PartnerConstants.CODE_INFO_SUP_EVA_RESULT_TYPE_SCORE.equals(supEvaResultTypeCode)
||PartnerConstants.CODE_INFO_SUP_EVA_RESULT_TYPE_LEVEL.equals(supEvaResultTypeCode)){
//按分值下线排序
sortResults(supEvaSystemResults);
boolean flag=false;
for(int i = 0;i<supEvaSystemResults.size();i++){
//分值下线
BigDecimal scoreLowerBefore = supEvaSystemResults.get(i).getScoreLower();
//分值上线
BigDecimal scoreLimitBefore = supEvaSystemResults.get(i).getScoreLimit();
for(int j=i+1;j<supEvaSystemResults.size();j++){
BigDecimal scoreLowerAfter = supEvaSystemResults.get(j).getScoreLower();
if(scoreLowerBefore.compareTo(scoreLowerAfter)==0){// 1)如果前、后两条数据 分值下线相等 则不满足条件
flag=true;
}else if(scoreLimitBefore.compareTo(scoreLowerAfter)>=0){//2)如果前一条的分值上线大于等于后一条的分值下线则不满足条件
flag=true;
}
}
}
//评分或者评级的分值范围不能交叉
if(flag)
/**
* 按分值下线从小到大排序
* @param supEvaSystemResults
*/
private void sortResults(List<SupplierEvaluationSystemResultEntity> supEvaSystemResults){
Collections.sort(supEvaSystemResults, new Comparator<SupplierEvaluationSystemResultEntity>(){
public int compare(SupplierEvaluationSystemResultEntity r1, SupplierEvaluationSystemResultEntity r2)
看了这个思路:总结出大致思路就是先对得到的对象数据拍照上限或者下限的字段进行排序,然后for循环进行比较如果前后两条数据的分值下限相等则不满足条件;前一条分值上限大于等于后一条分值下限则不满足条件;
于是我就上网找了个方法是按照某个字段对数组元素进行排序,方法如下:
//by函数接受一个成员名字符串做为参数 //并返回一个可以用来对包含该成员的对象数组进行排序的比较函数 var by = function(name){ return function(o, p){ var a, b; if (typeof o ===
"object" && typeof p === "object" && o && p) { a = o[name]; b = p[name]; if (a === b) { return 0; } if (typeof a ===
typeof b) { return a < b ? -1 : 1; } return typeof a < typeof b ? -1 : 1; } else { throw ("error"); } } }
然后用.net方法写了上限值交叉的方法如下:
//判断分值上下限是否交叉
crientity.sort(by("scoreLower"));
var criflag=true;
for(var m = 0;m<crientity.length;m++)
{
//分值下线
var scoreLowerBefore =crientity[m].scoreLower;
//分值上线
var scoreLimitBefore = crientity[m].scoreLimit;
for(var j=m+1;j<crientity.length;j++){
var scoreLowerAfter = crientity[j].scoreLower;
if(parseFloat(scoreLowerBefore)==parseFloat(scoreLowerAfter)){// 1)如果前、后两条数据 分值下线相等 则不满足条件
//arrAlertMessage.push("图解式分值上下限不能交叉!");
criflag=false;
}else if(parseFloat(scoreLimitBefore)>=parseFloat(scoreLowerAfter)){//2)如果前一条的分值上线大于等于后一条的分值下线则不满足条件
// arrAlertMessage.push("图解式分值上下限不能交叉!");
criflag=false;
}
}
}
if(!criflag)
{
arrAlertMessage.push("图解式分值上下限不能交叉!");
}
一下是另一种解决这种问题的方法:
不用排序,直接进行比较;但是这样比较就成了前一条数据的下限值大于等于后一条数据的下限值或者后一条数据的下限值小于等于前一条数据的上限值;
前一条数据的下限值大于等于后一条数据的上限值或者后一条数据的上限值小于等于后一条数据的上限值;
这是同事用的这种方法,但是总觉得这样不进行排序就比较可能会出问题;
分值上下限不能交叉:
//价格信息确认
function PriceClientClick(e)
{
RemoveGridAllEditControl($find("<%=WgMaterialPrice.ClientID %>"));
var objEntity = <%=wgMaterial.StrClientOprDetailName %>;
if(objEntity!=null)
{
var arrAlertMessage = [];
var lstPrice = <%=WgMaterialPrice.StrClientOprEntityList %>;
if(lstPrice!=null && lstPrice.length>0)
{
for(var i=0;i<lstPrice.length;i++)
{
if(lstPrice[i].minimumPurchases !=null&&lstPrice[i].maximumPurchases !=null)
{
if(parseInt(lstPrice[i].minimumPurchases)>parseInt(lstPrice[i].maximumPurchases))
{
arrAlertMessage.push("供货价格信息:第"+(i+1)+"行采购量(从)不能为大于采购量(到)!<br/>");
}
else
{
for(var j=i+1;j<lstPrice.length;j++)
{
if(parseInt(lstPrice[j].minimumPurchases)<=parseInt(lstPrice[j].maximumPurchases))
{
if(parseInt(lstPrice[i].minimumPurchases)<=parseInt(lstPrice[j].minimumPurchases)||parseInt(lstPrice[j].minimumPurchases)<=parseInt(lstPrice
然后用.net方法写了上限值交叉的方法如下:
//判断分值上下限是否交叉
crientity.sort(by("scoreLower"));
var criflag=true;
for(var m = 0;m<crientity.length;m++)
{
//分值下线
var scoreLowerBefore =crientity[m].scoreLower;
//分值上线
var scoreLimitBefore = crientity[m].scoreLimit;
for(var j=m+1;j<crientity.length;j++){
var scoreLowerAfter = crientity[j].scoreLower;
if(parseFloat(scoreLowerBefore)==parseFloat(scoreLowerAfter)){// 1)如果前、后两条数据 分值下线相等 则不满足条件
//arrAlertMessage.push("图解式分值上下限不能交叉!");
criflag=false;
}else if(parseFloat(scoreLimitBefore)>=parseFloat(scoreLowerAfter)){//2)如果前一条的分值上线大于等于后一条的分值下线则不满足条件
// arrAlertMessage.push("图解式分值上下限不能交叉!");
criflag=false;
}
}
}
if(!criflag)
{
arrAlertMessage.push("图解式分值上下限不能交叉!");
}
一下是另一种解决这种问题的方法:
不用排序,直接进行比较;但是这样比较就成了前一条数据的下限值大于等于后一条数据的下限值或者后一条数据的下限值小于等于前一条数据的上限值;
前一条数据的下限值大于等于后一条数据的上限值或者后一条数据的上限值小于等于后一条数据的上限值;
这是同事用的这种方法,但是总觉得这样不进行排序就比较可能会出问题;
分值上下限不能交叉:
//价格信息确认
function PriceClientClick(e)
{
RemoveGridAllEditControl($find("<%=WgMaterialPrice.ClientID %>"));
var objEntity = <%=wgMaterial.StrClientOprDetailName %>;
if(objEntity!=null)
{
var arrAlertMessage = [];
var lstPrice = <%=WgMaterialPrice.StrClientOprEntityList %>;
if(lstPrice!=null && lstPrice.length>0)
{
for(var i=0;i<lstPrice.length;i++)
{
if(lstPrice[i].minimumPurchases !=null&&lstPrice[i].maximumPurchases !=null)
{
if(parseInt(lstPrice[i].minimumPurchases)>parseInt(lstPrice[i].maximumPurchases))
{
arrAlertMessage.push("供货价格信息:第"+(i+1)+"行采购量(从)不能为大于采购量(到)!<br/>");
}
else
{
for(var j=i+1;j<lstPrice.length;j++)
{
if(parseInt(lstPrice[j].minimumPurchases)<=parseInt(lstPrice[j].maximumPurchases))
{
if(parseInt(lstPrice[i].minimumPurchases)<=parseInt(lstPrice[j].minimumPurchases)||parseInt(lstPrice[j].minimumPurchases)<=parseInt(lstPrice
[i].maximumPurchases))
{
arrAlertMessage.push("供货价格信息:第"+(i+1)+"行采购量与第"+(j+1)+"采购量不能交叉!<br/>");
}
else if(parseInt(lstPrice[i].minimumPurchases)<=parseInt(lstPrice[j].maximumPurchases)||parseInt(lstPrice[j].maximumPurchases)<=parseInt(lstPrice
{
arrAlertMessage.push("供货价格信息:第"+(i+1)+"行采购量与第"+(j+1)+"采购量不能交叉!<br/>");
}
else if(parseInt(lstPrice[i].minimumPurchases)<=parseInt(lstPrice[j].maximumPurchases)||parseInt(lstPrice[j].maximumPurchases)<=parseInt(lstPrice
[i].maximumPurchases))
{
arrAlertMessage.push("供货价格信息:第"+(i+1)+"行采购量与第"+(j+1)+"采购量不能交叉!<br/>");
}
}
}
}
}
}
}
{
arrAlertMessage.push("供货价格信息:第"+(i+1)+"行采购量与第"+(j+1)+"采购量不能交叉!<br/>");
}
}
}
}
}
}
}
转载于:https://blog.51cto.com/zhjjzhjj/668513