2013-11-02 2 views
1

У меня есть метод getFormattedValue(List<String> dataHeaders, List<String> data), который возвращает содержимое на основе данных на основе данных String и список данных. listHeaders может иметь 10 различных значений и основываться на значении при определенных изменениях строки строки вывода индекса.Нужно пересмотреть существующую логику для динамического ввода

Ниже код работал отлично, когда содержимое dataHeaders получено в определенном порядке, но в последнее время этот порядок меняет многие периоды. Поскольку этот вход получен от другого приложения/системы, у меня нет контроля над порядком элементов. Поэтому я хочу обновить свой код, чтобы он работал корректно даже после изменения порядка ввода.

Если 1-й элемент списка данныхHeaders является «OPERATION_NAME», тогда мне не нужно предпринимать никаких действий, но если «index_exchange» приходит в 2-й индекс в списке dataHeaders, тогда мне нужно сделать специальное форматирование для вывода значения. И так далее ....

Моя боль в том, что я получаю 10 dataHeaders. Пожалуйста, предложите мне хороший подход к решению этой проблемы. Я размещаю свой код ниже, предложения приветствуются.

import java.util.ArrayList; 
import java.util.List; 


public class ValueGenerator { 

    public String getFormattedValue(List<String> dataHeaders, List<String> data){ 

     String formattedOutValue=null; 

     if(dataHeaders!=null && data!=null && 
       dataHeaders.size() == data.size()){ 
      if(dataHeaders.get(0).equals("OPERATION_NAME")){ 
       formattedOutValue=data.get(0); // Add no spaces 
      }else if(dataHeaders.get(1).equals("OPERATION_NAME")){ 
       formattedOutValue=data.get(1)+" "; // Add 4 blank spaces 
      }else if(dataHeaders.get(2).equals("OPERATION_NAME")){ 
       formattedOutValue=data.get(2)+"  "; // Add 6 blank spaces 
      }   

     } 

      //likewise i want to avoid redundant if - else if check 


     return formattedOutValue; 
    } 


} 

ответ

0

Я предполагаю, что вы хотите data.get(2) в случае dataHeaders.get(2) и не data.get(1)

В основном вам просто нужно найти индекс строки OPERATION_NAME в dataHeaders и использовать его для data. Самый простой способ - перебрать список dataHeaders с индексом и остановиться, когда вы его найдете.

Если вам нужно обрабатывать больше строк, то вы могли бы использовать Map для отображения строк, которые вы хотите, чтобы оценить их показателей, это может выглядеть следующим образом:

final static Map<Integer, String> formatByIndexMap; 
static { 
    formatByIndexMap = new HashMap<>(); 
    formatByIndexMap.put(0, ""); 
    formatByIndexMap.put(1, " "); 
    formatByIndexMap.put(2, "  "); 
    // and so on 
    formatByIndexMap.put(9, "----format for 10----"); 
} 

public String getFormattedValue(List<String> dataHeaders, List<String> data){ 
    String formattedOutValue = null; 
    if (dataHeaders != null && data != null && 
      dataHeaders.size() == data.size()) { 
     Map<String, Integer> dhm = new HashMap<>(); 
     for(int i = 0; i < dataHeaders.size(); i++) { 
      dhm.put(dataHeaders.get(i), i); 
     } 
     Integer operationNameIndex = dhm.get("OPERATION_NAME"); 
     if(operationNameIndex != null) { 
      formattedOutValue = data.get(operationNameIndex.intValue()) + 
        formatByIndexMap.get(operationNameIndex); 
     } 
    } 
    return formattedOutValue; 
} 

Формат карты formatByIndexMap это определяет как final static ,

для некоторого базового тестирования:

@Test 
public void getFormattedValue() { 
    List<String> data = Arrays.asList("operation", "foo", "bar"); 
    List<String> dataHeaders; 
    String formated; 

    dataHeaders = Arrays.asList("OPERATION_NAME", "FOO_NAME", "BAR_NAME"); 
    formated = getFormattedValue(dataHeaders, data); 
    Assert.assertEquals("operation", formated); // no spaces 

    dataHeaders = Arrays.asList("FOO_NAME", "OPERATION_NAME", "BAR_NAME"); 
    formated = getFormattedValue(dataHeaders, data); 
    Assert.assertEquals("foo ", formated); // four spaces 

    dataHeaders = Arrays.asList("FOO_NAME", "BAR_NAME", "OPERATION_NAME"); 
    formated = getFormattedValue(dataHeaders, data); 
    Assert.assertEquals("bar  ", formated); // six spaces 

    dataHeaders = Arrays.asList("FOO_NAME", "BAR_NAME", "", "", "", "", "", 
      "", "", "OPERATION_NAME"); 
    data = Arrays.asList("operation", "foo", "bar", "", "", "", "", 
      "", "", "tail"); 
    formated = getFormattedValue(dataHeaders, data); 
    // ----format for 10---- 
    Assert.assertEquals("tail----format for 10----", formated); 
} 
+0

Да, что было опечатка, исправил. Моя реальная проблема начинается после того, как я знаю индекс, так как число индексов меняется, поэтому моя логика возвращает формуемую строку. Вместо того, чтобы делать много if-else if, мне нужно какое-то общее решение. –

+0

@DarkKnight Я отредактировал код, чтобы сделать его более четким. Что конкретно означает по индексу? знаете ли вы максимальное число, которое может иметь индекс (похоже, поскольку вы упоминаете 10 заголовков данных)? Если затем просто поместите все ваши форматы в карту по их соответствующему индексу. Если нет, вы можете создать одну и ту же карту динамически в зависимости от размера ваших списков. – A4L

+0

Большое спасибо за быстрый ответ, с изменением индекса. Я хочу сказать, что могут быть максимальные заголовки, выходящие из 20 или около того предопределенных, и каждый заголовок имеет другую схему значений, основанную на его индексе. При существующем подходе нам нужно создать 20 карт. Есть ли другая альтернатива для этого в целом. Пожалуйста, предложите. –

Смежные вопросы