1

我有一个getFormattedValue(List<String> dataHeaders, List<String> data)返回基于字符串值的 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;
    }


}
4

1 回答 1

0

我假设你想要data.get(2)的情况下dataHeaders.get(2)而不是data.get(1)

基本上你只需要找到字符串的索引OPERATION_NAME并将dataHeaders其用于data. 最简单的方法是使用索引遍历列表dataHeaders并在找到它时停止。

如果您需要处理更多字符串,则可以使用 aMap将要评估的字符串映射到它们的索引,这可能如下所示:

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); 
}
于 2013-11-02T17:51:44.390 回答