我有一个方法getFormattedValue(List<String> dataHeaders, List<String> data)返回基于字符串值的dataHeaders和数据列表的内容。 dataHeaders列表可以具有10个不同的值,并基于特定索引输出字符串形成更改时的值。

下面的代码在按特定顺序接收dataHeaders内容的时间上一直工作良好,但是最近这个顺序已经改变了很多次。由于此输入是从其他应用程序/系统接收的,因此我无法控制元素的顺序。因此,我想更新我的代码,以便即使在更改输入顺序后也能正常工作。

如果dataHeaders列表的第1个元素是“ OPERATION_NAME”,那么我无需采取任何措施,但是如果dataOPEers列表的第2个索引处是“ OPERATION_NAME”,则我需要进行特殊格式设置以输出值。等等....

我的痛苦是我收到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;
    }


}

最佳答案

我假设您要使用data.get(2),而不是dataHeaders.get(2)

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

如果需要处理更多的字符串,则可以使用dataHeaders将要评估的字符串映射到其索引,如下所示:

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;
}


格式映射Map定义为formatByIndexMap

用于一些基本测试:

@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);
}

09-11 03:56