【问题标题】:How to read efficiently a csv list in particular defined sort order?如何以特定定义的排序顺序有效地读取 csv 列表?
【发布时间】:2019-10-23 09:20:41
【问题描述】:

我正在阅读CSV 并使用ICsvBeanReader 将其映射到List<SomeBean>

csv:

someName,someNumber,report,env,dir
TEST1,111111111111,DES,T,LAS
TEST1,111111111111,INV,T,LAS
TEST1,111111111111,DES,T,FIRS
TEST1,111111111111,INV,T,FIRS
TEST1,111111111111,ORD,P,FIRS
TEST1,111111111111,ORD,P,LAS

拥有List<SomeBean> 数据列表后,我将运行嵌套 for 循环以实现我想要实现的目标。

定义顺序:

{1-FIRS, 2-LAS}
{1-P, 2-T}
{1-ORD, 2-DES, 3-INV}

预期: 'someNumber' 和 report、env、dir 组合的映射(在定义的订单中)。

111111111111,ORD-P-FIRS
111111111111,DES-T-FIRS
111111111111,INV-T-FIRS
111111111111,ORD-P-LAS
111111111111,DES-T-LAS
111111111111,INV-T-LAS

编码:

获取订单:

Map<Integer, String> dirOrder = {1-FIRS, 2-LAS}; // getting from defined config
Map<Integer, String> envOrder = {1-P, 2-T}; // getting from defined config
Map<Integer, String> reportOrder = {1-ORD, 2-DES, 3-INV};// getting from defined config

为准备地图运行循环:

MultiValuedMap < String, String > mapProperOrder = new ArrayListValuedHashMap < > ();

        for (Map.Entry < Integer, String > directionEntry: dirOrder.entrySet()) {
         String directionValue = directionEntry.getValue();

         for (Map.Entry < Integer, String > envirionmentEntry: envOrder.entrySet()) {
          String envirionmentValue = envirionmentEntry.getValue();

          for (Map.Entry < Integer, String > reportTypeEntry: reportOrder.entrySet()) {
           String reportTypeValue = reportTypeEntry.getValue();

           for (SomeBean someBean: (List < SomeBean > ) someList) {

            String num = someBean.getNum();
            String dir = someBean.getDir();
            String env = someBean.getEnv();
            String report = someBean.getReport);

           boolean directionCheck = dir.equalsIgnoreCase(directionValue) ? true : false;
           boolean envirionmentCheck = env.equalsIgnoreCase(envirionmentValue) ? true : false;
           boolean reportTypeCheck = report.equalsIgnoreCase(reportTypeValue) ? true : false;

           if (directionCheck && envirionmentCheck && reportTypeCheck) {
            mapProperOrder.put(num, report + "-" + env + "-" + dir);
           }
         }
       }
     }
   }

这段代码完成了它的工作,但是如果我在 CSV 中有多个“someNumber”怎么办,为所有记录运行嵌套的 for 循环将效率不高。

请帮我写一个简单而有效的方法来处理这个。

【问题讨论】:

    标签: java spring-boot csv collections


    【解决方案1】:

    我个人会在SomeBean 中实现Comparable 接口,如果此订单是应用程序范围内的默认订单或自定义Comparator,否则。

    实现可能如下所示:

    public int compare(SomeBean o1, SomeBean o2) {
        Map<String, Integer> firstLevel = new HashMap<>();
        firstLevel.put("FIRS", 1);
        firstLevel.put("LAS", 2);
    
    
        int cmp = firstLevel.get(o1.getDir()).compareTo(firstLevel.get(o2.getDir()));
    
        if (cmp != 0) {
            return cmp;
        }
    
        Map<String, Integer> secondLevel = new HashMap<>();
        secondLevel.put("P", 1);
        secondLevel.put("T", 2);
    
        cmp = secondLevel.get(o1.getEnv()).compareTo(secondLevel.get(o2.getEnv()));
    
        if (cmp != 0) {
            return cmp;
        }
    
        Map<String, Integer> thirdLevel = new HashMap<>();
        thirdLevel.put("ORD", 1);
        thirdLevel.put("DES", 2);
        thirdLevel.put("INV", 3);
    
        return thirdLevel.get(o1.getReport()).compareTo(thirdLevel.get(o2.getReport()));
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2017-12-14
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多