2017-07-07 21 views
0

的java比较多个值,并找到我需要找到最匹配的员工工资在数据库记录作为最佳匹配

Name: City:  State: 

A  (null) (null) 

A  (null) DEL 

(null) (null) (null) 

A  SAKET DEL 

比赛顺序应该是:

NAME =名称,状态=州,城市=城市

2. NAME =名,STATE =州,城市= NULL

NAME =名称,状态= NULL,CITY = NULL

4. NAME = NULL,州= NULL,CITY = NULL

意味着如果在一排,所有属性相符的 - 它应选择,如果我们没有那种数据,我们应该去下一个最好的选择,如选择州和城市为NULL等

我的代码如下,给我正确的结果,但我需要一个更高效办法。

private static BigDecimal getsalaryForBestMatch(ResultSet results, EmployeeRq request) throws Exception{ 
    BigDecimal salary = null; 
    BigDecimal salaryWithState = null; 
    BigDecimal salaryWithName = null; 
    BigDecimal salaryWithNoMatch = null; 
    while (results.next()) { 

     String billerName = results.getString("EMP_NAME") != null ? results.getString("EMP_NAME").trim() : null; 
     String city = results.getString("CITY") != null ? results.getString("CITY").trim() : null; 
     String state = results.getString("STATE") != null ? results.getString("STATE").trim() : null; 

     BigDecimal salaryRslt = null; 

     if(results.getString("SALARY") != null){ 
      salaryRslt = BigDecimal.valueOf(results.getDouble("SALARY"));    
     } 
     if(billerName != null && !billerName.equals("") && billerName.equals(request.getBillPaymentsalaryCalculateInfo().getBillerName())){ 
      if(city != null && !city.equals("") && city.equals(request.getMsgRqHdr().getCity()) && 
        state != null && !state.equals("") && state.equalsIgnoreCase(request.getMsgRqHdr().getstate())){ 
       salary = salaryRslt; 
       break; 
      } else if((city == null || city.equals("")) && state != null && !state.equals("") && 
        state.equalsIgnoreCase(request.getMsgRqHdr().getState())){ 
       salaryWithState = salaryRslt;     
      } else if((city == null || city.equals("")) && (state == null || state.equals(""))){ 
       salaryWithName = salaryRslt;      
      } 
     } else if((billerName == null || billerName.equals("")) && (city == null || city.equals("")) && 
       (state == null || state.equals(""))){ 
      salaryWithNoMatch = salaryRslt;    
     } 
    } 

    if(salary != null){ 
     return salary; 
    } else if(salaryWithState != null){ 
     salary = salaryWithState; 
    } else if(salaryWithName != null){ 
     salary = salaryWithName; 
    } else if(salaryWithNoMatch != null){ 
     salary = salaryWithNoMatch; 
    } 

    return salary; 

} 

编辑:我不想使用3个额外的变量:salaryWithState,salaryWithName,salaryWithNoMatch。

+1

这可能会更好Code Review – JonK

+0

Use-StringUtils.isBlank()。它将以单镜头检查空白,空白和空字符串。这将在一定程度上简化您的代码。 –

+0

@KeyurPanchal或OP可能会创建一个静态方法来做到这一点,如果他不想使用库类..但它是一个很好的建议,但 – Yahya

回答

0

我只想给出一般的想法如何实现,所以我没有实际测试过,并检查它是否会给你合适的薪水。

public BigDecimal getSalaryForBestMatch(ResultSet resultSet, PaymentSalaryInfo paymentSalaryInfo) { 
    Map<String, Supplier<String>> m1 = new HashMap<>(); 
    m1.put("EMP_NAME", paymentSalaryInfo::getBillerName); 
    m1.put("STATE", paymentSalaryInfo::getState); 
    m1.put("CITY", paymentSalaryInfo::getCity); 

    Map<String, Supplier<String>> m2 = new HashMap<>(); 
    m2.put("STATE", paymentSalaryInfo::getState); 
    m2.put("CITY", paymentSalaryInfo::getCity); 

    Map<String, Supplier<String>> m3 = new HashMap<>(); 
    m3.put("CITY", paymentSalaryInfo::getCity); 


    Optional<String> salary = Optional.empty(); 

    while(resultSet.next() && !salary.isPresent()) { 
     salary = apply(m1, resultSet); 
     //check salary and then apply(m2, resultSet) .... 
    } 

    return salary.isPresent() ? new BigDecimal(salary.get()) : null; 
} 


public Optional<String> apply(Map<String, Supplier<String>> filter, ResultSet resultSet) { 
    boolean allMatch = filter.entrySet().stream().allMatch(entry -> { 
     String value = resultSet.getString(entry.getKey()); 

     return value != null && value.equals(entry.getValue().get()); 
    }); 

    return allMatch ? Optional.of(resultSet.getString("salary")) : Optional.empty(); 
} 
0

我已经用不同的方式使用数组写了相同的逻辑。如果您的环境可以使用数组,则可以使用此代码。但我没有测试过这些代码。

private static BigDecimal getsalaryForBestMatch(ResultSet results, EmployeeRq request) throws Exception{ 
    BigDecimal salary = null; 
    int matchCount = 0; 
    String rBillerName = request.getBillPaymentsalaryCalculateInfo().getBillerName(); 
    String rCity = request.getMsgRqHdr().getCity(); 
    String rState = request.getMsgRqHdr().getstate(); 

    String [] truthArray = new String[] {rBillerName, rCity, rState}; 

    while (results.next()) { 
     String billerName = results.getString("EMP_NAME") != null ? results.getString("EMP_NAME").trim() : null; 
     String city = results.getString("CITY") != null ? results.getString("CITY").trim() : null; 
     String state = results.getString("STATE") != null ? results.getString("STATE").trim() : null; 
     BigDecimal salaryRslt = results.getString("SALARY") != null ? BigDecimal.valueOf(results.getDouble("SALARY")): null; 

     String [] testArray = new String[] {billerName, city, state}; 

     int localMatchCount = 0; 
     for(int i = 0; i < testArray.length; i++) { 
      if(testArray[i] != null && testArray[i].equals(truthArray[i])) 
       localMatchCount++; 
      else { 
       break; 
      } 
     } 

     if(localMatchCount >= matchCount){ 
      matchCount = localMatchCount; 
      salary = salaryRslt; 
     } 
    } 
    return salary; 
}