Как автоматизировать функцию в соответствии с размером списка массива - PullRequest
0 голосов
/ 06 апреля 2020

Извините, этот заголовок вопроса не на 100% правильный. Из-за этого я объясню свой сценарий здесь. Я создал функцию для объединения 4 наборов данных в один формат возврата. Потому что это необходимая сторона формата. Теперь все работает нормально.

public ReturnFormat makeThribleLineChart(List<NameCountModel> totalCount, List<NameCountModel>,p1Count, List<NameCountModel> p2Count, List<NameCountModel> average) {

        ReturnFormat returnFormat = new ReturnFormat(null,null);

            try {

                String[] totalData = new String[totalCount.size()];
                String[] p1Data = new String[p1Count.size()];
                String[] p2Data = new String[p2Count.size()];
                String[] averageData = new String[p2Count.size()];
                String[] lableList = new String[totalCount.size()];

                for (int x = 0; x < totalCount.size(); x++) {
                    totalData[x] = totalCount.get(x).getCount();
                    p1Data[x] = p1Count.get(x).getCount();
                    p2Data[x] = p2Count.get(x).getCount();
                    averageData[x] = average.get(x).getCount();
                    lableList[x] = totalCount.get(x).getName();
                }

                FormatHelper<String[]> totalFormatHelper= new FormatHelper<String[]>();
                totalFormatHelper.setData(totalData);
                totalFormatHelper.setType("line");
                totalFormatHelper.setLabel("Uudet");
                totalFormatHelper.setyAxisID("y-axis-1");

                FormatHelper<String[]> p1FormatHelper= new FormatHelper<String[]>();
                p1FormatHelper.setData(p1Data);
                p1FormatHelper.setType("line");
                p1FormatHelper.setLabel("P1 päivystykseen heti");

                FormatHelper<String[]> p2FormatHelper= new FormatHelper<String[]>();
                p2FormatHelper.setData(p2Data);
                p2FormatHelper.setType("line");
                p2FormatHelper.setLabel("P2 päivystykseen muttei yöllä");

                FormatHelper<String[]> averageFormatHelper= new FormatHelper<String[]>();
                averageFormatHelper.setData(averageData);
                averageFormatHelper.setType("line");
                averageFormatHelper.setLabel("Jonotusaika keskiarvo");
                averageFormatHelper.setyAxisID("y-axis-2");

                List<FormatHelper<String[]>> formatHelpObj = new ArrayList<FormatHelper<String[]>>();
                formatHelpObj.add(totalFormatHelper);
                formatHelpObj.add(p1FormatHelper);
                formatHelpObj.add(p2FormatHelper);
                formatHelpObj.add(averageFormatHelper);

                returnFormat.setData(formatHelpObj);
                returnFormat.setLabels(lableList);
                returnFormat.setMessage(Messages.Success);
                returnFormat.setStatus(ReturnFormat.Status.SUCCESS);


            } catch (Exception e) {

                returnFormat.setData(null);
                returnFormat.setMessage(Messages.InternalServerError);
                returnFormat.setStatus(ReturnFormat.Status.ERROR);

            }
            return returnFormat;

    }

, поэтому, как вы можете видеть здесь, все форматирование жестко закодировано. Поэтому мой вопрос заключается в том, как автоматизировать этот код для подсчета списка. Давайте предположим, что в следующий раз мне нужно будет создать форматирование диаграммы для пяти наборов данных. Поэтому я должен создать еще одну функцию для него. Это то, что я хочу уменьшить. Надеюсь, вы понимаете мой вопрос.

Спасибо.

1 Ответ

2 голосов
/ 06 апреля 2020

Вы пытаетесь решить более общую проблему составления результирующего объекта (в данном случае ReturnFormat) на основе динамической c информации. Кроме того, вместе с каждым набором данных настраиваются метаданные - тип, метка и т. Д. c. В примере, который вы опубликовали, вы жестко закодировали связь между набором данных и этими метаданными, но вам понадобится какой-то способ установить sh это отношение для данных динамически, если у вас здесь переменное число параметров.

Таким образом, у вас есть несколько вариантов:

  • Сделать makeThribleLineChart метод varargs , чтобы принять переменное число параметров, представляющих ваши данные. Теперь у вас есть проблема связывания метаданных с вашими параметрами - лучший вариант, вероятно, состоит в том, чтобы обернуть данные и метаданные вместе в какой-то новый объект, который предоставляется в качестве каждого параметра makeThribleLineChart.
    Таким образом, вы получите сигнатуру это немного похоже на ReturnFormat makeThribleLineChart(DataMetadataWrapper... allDatasets), где DataMetadataWrapper содержит все необходимое для создания одного экземпляра FormatHelper.
  • Используйте шаблон компоновщика, аналогичный компоновщикам коллекций в guava , для Пример примерно так:

class ThribbleLineChartBuilder {
    List<FormatHelper<String[]>> formatHelpObj = new ArrayList<>();

    ThribbleLineChartBuilder addDataSet(String describeType, String label, String yAxisId, List<NameCountModel> data) {
        String[] dataArray = ... ; // build your array of data

        FormatHelper<String[]> formatHelper = new FormatHelper<String[]>();
        formatHelper.setData(dataArray);
        formatHelper.setType(describeType);
        ... // set any other parameters that the FormatHelper requires here

        formatHelpObj.add(formatHelper);

        return this;
    }

    ReturnFormat build() {
        ReturnFormat returnFormat = new ReturnFormat(null, null);
        returnFormat.setData(this.formatHelpObj);
        ... // setup any other fields you need in ReturnFormat

        return returnFormat;
    }
}

// usage:
new ThribbleLineChartBuilder()
 .addDataSet("line", "Uudet", "y-axis-1", totalCount)
 .addDataSet("line", "P1 päivystykseen heti", null, p1Count)
 ... // setup your other data sources
 .build()
...