在工作過程中遇到瞭多條記錄比較分值上下限的問題,首先是用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)
/**
* 按分值下線從小到大排序
* @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
[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
[i].maximumPurchases))
{
arrAlertMessage.push("供貨價格信息:第"+(i+1)+"行采購量與第"+(j+1)+"采購量不能交叉!<br/>");
}
}
}
}
}
}
}
作者 “zhangjingjing”