2013-11-02 27 views
1

我有一個方法getFormattedValue(List<String> dataHeaders, List<String> data),它返回基於String值的dataHeaders和數據列表的內容。 dataHeaders列表可以有10個不同的值,並基於特定索引輸出字符串形成更改的值。需要重新設計動態輸入的現有邏輯

下面的代碼工作正常,當dataHeaders內容按特定順序接收時,但最近這個順序一次又一次地改變。由於此輸入是從其他應用程序/系統收到的,因此我無法控制元素的順序。因此,我想更新我的代碼,以便它在輸入順序改變後仍能正常工作。

如果dataHeaders列表的第一個元素是「OPERATION_NAME」,那麼我不需要採取任何行動,但是如果「OPERATION_NAME」出現在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

我假設你在dataHeaders.get(2)的情況下想data.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

是的,這是錯字,糾正它。我真正的問題開始後,我知道索引,因爲索引號變化,所以我的邏輯返回形式的字符串。如果不這樣做,我會需要一些通用的解決方案。 –

+0

@DarkKnight我編輯了代碼,使其更清晰。指數究竟意味着什麼?你知道索引可以擁有的最大數量嗎(你似乎,因爲你提到了10個數據頭)?如果那麼只要把他們所有的格式都放到地圖上。如果不是,那麼您可以根據列表的大小動態地構建相同的地圖。 – A4L

+0

非常感謝您的快速響應,索引不盡相同,我的意思是說可以有20個左右的預定義標頭出現,並且每個標頭都有基於索引的不同價值體系。採用目前的方法,我們需要創建20個地圖。有沒有其他的選擇可以一般地做到這一點。請建議。 –