Search code examples
javaspringspring-bootif-statementspring-mybatis

Comparing the current line with the previous one. Java


I want to compare the current line with the previous one, and if they match, do the calculation. If not, assign 0.0 My code only computes without accepting the condition.

for example i have table: oil oil consist a month, date and an indicator

And it have to look like:

Month      Values  Date        |formula              |Growth
september   100     01.09.2020  |(100/nan - 1) * 100  |infinity
september   80      08.09.2020  |(80/100-1) * 100     |-20
september   100     15.09.2020  |(100/80-1) * 100     |25     
october     118     01.10.2020  |september != october |0
october     120     08.10.2020  |(120/118-1) * 100    |1.69                 
october     123     15.10.2020  |(123/120-1) * 100    |2.5
november    122     01.11.2020  |october != november  |0
november    122     08.11.2020  |(122/122-1) * 100    |0                    

My class model:

@Entity
@Table(name = "oper_mon_oil_price")

public class OilModel {

@Id
@GeneratedValue(strategy =  GenerationType.IDENTITY)
private long id;
@Column(name = "o_year")
private String oyear;
@Column(name = "o_month")
private String omonth;
@Column(name = "o_date_event")
private String odateEvent;
@Column(name = "o_period")
private String operiod;
@Column(name = "o_area")
private String oarea;
@Column(name = "o_unit")
private String ounit;
@Column(name = "o_ai_92")
public Double oai92;
@Column(name = "o_ai_95")
public Double oai95;
@Column(name = "o_diesel_winter")
private Double odieselWinter;
@Column(name = "o_diesel_fuel_offseason")
private Double odieselFuelOffseason;
@Column(name = "growth_ai_92")
public Double growthAi92;
@Column(name = "growth_ai_95")
public Double growthAi95;
@Column(name = "growth_diesel_winter")
public Double growthDieselWinter;
@Column(name = "growth_diesel_fuel_offseason")
public Double growthDieselFuelOffseason;
 
getters/setters
}

class repository:

@Repository
@Mapper
public interface OilProdTovRepo {

@Select("SELECT * FROM oper_mon_prod_tov ORDER BY o_year ASC, o_month ASC, o_date_event ASC ")
@Results(value ={
        @Result(property = "id",column = "id"),
        @Result(property = "area",column = "o_area"),
        @Result(property = "year",column = "o_year"),
        @Result(property = "month",column = "o_month"),
        @Result(property = "period",column = "o_period"),
        @Result(property = "dateEvent",column = "o_date_event"),
        @Result(property = "unit",column = "o_unit"),
        @Result(property = "wheatFlourFirstGrade",column = "o_wheat_flour_first_grade"),
        @Result(property = "wheatBread",column = "o_wheat_bread"),
        @Result(property = "horns",column = "o_horns"),
        @Result(property = "buckwheat",column = "o_buckwheat"),
        @Result(property = "polishedRice",column = "o_polished_rice"),
        @Result(property = "potato",column = "o_potato"),
        @Result(property = "carrots",column = "o_carrots"),
        @Result(property = "onion",column = "o_onion"),
        @Result(property = "cabbageWhite",column = "o_cabbage_white"),
        @Result(property = "sugar",column = "o_sugar"),
        @Result(property = "oil",column = "o_oil"),
        @Result(property = "beef",column = "o_beef"),
        @Result(property = "chickenMeat",column = "o_chicken_meat"),
        @Result(property = "milk",column = "o_milk"),
        @Result(property = "kefir",column = "o_kefir"),
        @Result(property = "butter",column = "o_butter"),
        @Result(property = "egg",column = "o_egg"),
        @Result(property = "salt",column = "o_salt"),
        @Result(property = "cottageCheese",column = "o_cottage_cheese"),
        @Result(property = "growthWheatFlourFirstGrade",column = "o_growth_wheat_flour_first_grade"),

})
List<OilProdTovModel> getOilProdTovModel();

@Update("UPDATE oper_mon_prod_tov SET o_growth_wheat_flour_first_grade=#{growthWheatFlourFirstGrade} WHERE id=#{id}")
void updateWheatFlourFirstGrade(OilProdTovModel oilProdTovModel);
}

And the main class, Service :

@Service
public class OilProdTovService {
@Autowired
public OilProdTovRepo oilProdTovRepo;

public List<OilProdTovModel> allOilProdTov() {
    List<OilProdTovModel> oilProdTovModels = oilProdTovRepo.getOilProdTovModel();
    Double first = 0.0;
    Double result;
    for (OilProdTovModel oilProdTovModel : oilProdTovModels) {
        if (oilProdTovModel.getMonth().equals("September")) {
            Double wheatFlourFirstGrade = oilProdTovModel.getWheatFlourFirstGrade();
            result = (wheatFlourFirstGrade / first - 1) * 100;
            first = wheatFlourFirstGrade;
            wheatFlourFirstGrade = result;
            oilProdTovModel.setGrowthWheatFlourFirstGrade(wheatFlourFirstGrade);
        } else if (oilProdTovModel.getMonth().equals("October")) {
            Double wheatFlourFirstGrade = oilProdTovModel.getWheatFlourFirstGrade();
            result = (wheatFlourFirstGrade / first - 1) * 100;
            first = wheatFlourFirstGrade;
            wheatFlourFirstGrade = result;
            oilProdTovModel.setGrowthWheatFlourFirstGrade(wheatFlourFirstGrade);
        }
        else if (oilProdTovModel.getMonth().equals("November")) {
            Double wheatFlourFirstGrade = oilProdTovModel.getWheatFlourFirstGrade();
            result = (wheatFlourFirstGrade / first - 1) * 100;
            first = wheatFlourFirstGrade;
            wheatFlourFirstGrade = result;
            oilProdTovModel.setGrowthWheatFlourFirstGrade(wheatFlourFirstGrade);
        }
        else {
            oilProdTovModel.setGrowthWheatFlourFirstGrade(0.0);
        }
        
        oilProdTovRepo.updateWheatFlourFirstGrade(oilProdTovModel);
    }
    return oilProdTovRepo.getOilProdTovModel();
}
}

How i can modified my code ?


Solution

  • Since you seem to struggle with getting hold of 2 entities that follow each other in list here's how you could do it:

    Using "foreach":

    List<OilProdTovModel> oilProdTovModels = ...
    OilProdTovModel prev = null;
    for (OilProdTovModel oilProdTovModel : oilProdTovModels) {
      if( prev != null ) {
        //compare oilProdTovModel and prev here
      }
    
      prev = oilProdTovModel; //keep track of the current element to serve as prev for the next iteration
    }
    

    Using a traditional for loop:

    for (int i = 1; i < oilProdTovModels.size(); i++) {
      OilProdTovModel prev = oilProdTovModels.get(i - 1);
      OilProdTovModel current = oilProdTovModels.get(i);
    
      //compare both - if you need to handle the first element without any comparison then do that before the loop 
      //(or iterate from 0 to size() - 1 and handle the last element after the loop if needed)
    }