我有一个方法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);
}