需要建议优化下面的代码

时间:2014-09-19 08:54:49

标签: java

我有一个数组,长度为3但它可能包含或不包含3索引中的数据,我必须根据数组中的数据追加三个查询。让我举一个例子。

array[0]="A";
array[1]="B";
array[2]="C";
String strqry1 = "so and so";
String strqry2 = "so and so";
String strqry3 = "so ans so";
String mainQuery = "";
int arrayLength = array.legth;
if(arrayLength == 1 ){
   if(array[0].equals("A")){
     mainQuery = strqry1 ;
   }else if(array[0].equals("B")){
     mainQuery = strqry2 ;
   }else if(array[0].equals("c")){
     mainQuery = strqry3 ;
   }
}
if(arrayLength == 2){
   if(array[0].equals("A") && array[1].equals("B")){
      mainQuery = strqry1 +"union all"+ strqry2 ;
   }else if(array[0].equals("A") && array[1].equals("C")){
      mainQuery = strqry1 +"union all"+ strqry3 ;
   }else if(array[0].equals("B") && array[1].equals("C")){
      mainQuery = strqry2 +"union all"+ strqry3 ;
   }
}
if(arrayLength == 3){
   if(array[0].equals("A") && array[1].equals("B") && array[2].equals("C")){
      mainQuery = strqry1 +"union all"+strqry2 +"union all"+ strqry3 ;
   }
}

我需要建议,我是否需要为3组If条件编写这样的排列和组合。我可以优化代码的任何其他方式。请建议我。

3 个答案:

答案 0 :(得分:2)

我建议制作检查一个值的方法,如果值匹配则返回查询。喜欢这样。

String check(String value) {
    if("A".equals(value)) return strqry1;
    if("B".equals(value)) return strqry2;
    if("C".equals(value)) return strqry3;
    return null;
}

然后在循环中调用此函数:

String result = "";
for(String value: array) {
    String qry = check(value);
    if(qry==null) continue;
    if(!gry.isEmpty()) gry += "union all";
    result += qry;
}

答案 1 :(得分:1)

如果输入值的顺序,要检查的常量和结果查询之间存在相关性,您也可以将它们作为数组处理:

    //constant values to check
    String[] constants={"A", "B", "C"};
    String[] queries={"so and so 1", "so and so 2", "so and so 3"};

    String mainQuery = "";
    String union="";

    for(int i=0; i<array.length && i<constants.length; i++) {

        if(array[i].equals(constants[i])) {
            mainQuery=mainQuery+union+queries[i]+" ";
            union=" union all ";
        }
    }

    System.out.println(mainQuery);

可以将新的常量和查询附加到它们上(作为输入参数或对象属性...)。此外,如果您可以将它们定义为外部可配置值(通过注入,属性文件等),则可以在不重写和重新部署代码的情况下更改它们。

答案 2 :(得分:1)

你必须使用数组吗?使用Java Hashmap做你想做的事情似乎更合理:Link&#34; A&#34; strqry1,&#34; B&#34;到strqry2和&#34; C&#34; strqry3。

import java.lang.StringBuilder;
import java.util.Hashmap;

Map<String, String> myQuery = new Hashmap<String,String>();
myQuery.put("A", strqry1);
myQuery.put("B", strqry2);
myQuery.put("C", strqry3);

然后构建所需的查询:

StringBuilder sb = new StringBuilder();
String queryString;

queryString = myQuery.get(array[0]);
if(queryString != null) {
    sb.append(queryString);
}

// now skip the first entry, proceed the rest
for(int i=1; i<array.length; i++) {
    sb.append(" union all "); // If you want to build a query, watch the whitespaces
    sb.append(queryString);
}

这将构造必要的字符串,而没有任何多余的&#34; union all&#34;在字符串中。您的结果查询将存储在StringBuilder sb。