Как эффективно прочитать список CSV в определенном порядке сортировки? - PullRequest
1 голос
/ 23 октября 2019

Я читаю CSV и сопоставляю его с List<SomeBean>, используя ICsvBeanReader.

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> dataList, я запускаю вложенный цикл, чтобы получить то, что я намерен достичь.

Определенный заказ:

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

Ожидаемый: Карта 'someNumber' и комбинация отчета, 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);
           }
         }
       }
     }
   }

Этот код выполняет свою работу, но что, если у меня есть несколько 'someNumber' в CSV, будет неэффективно запускать вложенный цикл for для всех записей.

Пожалуйста, помогите мне написать простой, но покаэффективный способ обработать это.

1 Ответ

0 голосов
/ 23 октября 2019

Я бы лично реализовал интерфейс Comparable в SomeBean, если этот порядок является заказом по умолчанию для всего приложения или пользовательским 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()));

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...