使用stringbuilder和for循环

时间:2015-10-02 14:23:22

标签: java for-loop stringbuilder

 private String generateSuffix(List<String[]> searches, List<String[]> sorts) {
        String ret = "";
        if (searches != null && !searches.isEmpty()) {
            ret += "where ";
            for (String[] search : searches) {
                if (search.length < 3) {
                    continue;
                }
                ret += search[0] + search[1] + search[2] + " and ";
            }
            ret = ret.substring(0, ret.length() - 5);
        }

        ret += " order by ";
        if (sorts != null && !sorts.isEmpty()) {
            for (String[] sort : sorts) {
                if (sort.length < 2) {
                    continue;
                }
                ret += sort[0] + " " + sort[1] + ",";
            }
        }
        return ret;
    }
}

我的SONAR扫描表明使用'+'连接循环中的字符串是一个重大错误。它没有提供有关如何修复此错误的深入见解。在这种情况下可以使用StringBuilder吗?如果是这样,我将如何使用增强的for循环实现StringBuilder?我对使用StringBuilder不是很熟悉。

另外,我可以在列表中添加StringBuilder,如下所示吗?我需要摆脱代码“value + = ds;”和值= d +“”“。

private List<TransactionSearchField> checkSearches(List<TransactionSearchField> searchesIn) {
    List<TransactionSearchField> searches = new ArrayList<TransactionSearchField>();
    if (searchesIn != null) {
        for (TransactionSearchField search : searchesIn) {
            String value = search.getValue();
            if (value != null && value.length() > 0) {
                if (search.getDataType().equals(double.class)) {
                    String[] dSplit = value.split(",");
                    value = "";
                    for (String ds : dSplit) {
                        value += ds;
                    }
                    double d;
                    try {
                        d = Double.parseDouble(value);
                        value = d + "";
                    } catch (IllegalArgumentException e) {
                        value = "";
                    }
                } else if (search.getDataType().equals(Date.class)) {
                    value = formatDate(generateDate(value));
                }
                searches.add(new TransactionSearchField(search.getDataType(), search.getTableField(), search.getLogic(), value, search.getViewField()));
            }
        }
    }
    return searches;
}

3 个答案:

答案 0 :(得分:4)

代码

result = result + newPart;

本质上是(假设结果是字符串)

result = new StringBuilder(result).append(newPart).toString();

如果将它放在循环中,则在每次迭代中,您将创建new StringBuilder对象,该对象将复制result String中的所有字符,然后将newPart附加到其中,然后创建另一个字符串将存储在result变量中。

对于长字符串,这是非常低效的,因为要添加甚至很小的部分,我们需要从当前结果复制所有字符(两次,一次创建StringBuilder时,再次创建新结果字符串时) )。

要避免此问题,而不是像

这样的字符串连接
String result = "";
for (String newPart : otherStrings){
    result = result + newPart;
    result = result + ", ";
}

我们应该为id创建一个StringBuilder和append个新部分。 StringBuilder类的优点在于它保存了字符数组中的字符,这些字符非常大,因此它有新的空间。如果某个点上的空间不够,StringBuilder将创建两倍大的新数组并复制所有字符。因此,它限制了我们需要调整数组大小并迭代所有字符的次数。

正确的解决方案如下:

StringBuilder sb = new StringBuilder();
for (String newPart : otherStrings){
    sb.append(newPart);
    sb.append(", ");
    //you could also chain these methods
    //sb.append(newPart).append(", ");
}
String result = sb.toString();

BTW StringBuilder允许对所保留的字符进行操作。例如,我们可以通过StringBuilder.delete(int start, int end)删除部分字符。

答案 1 :(得分:1)

您可以尝试这样的事情:

StringBuilder sb = new StringBuilder();
for(String[] sort : sorts){
    //Your other logic
    sb.append(sort[0]);
    sb.append(" ");
    sb.append(sort[1]);
    sb.append(",");
}

答案 2 :(得分:0)

从字符串连接到使用StringBuilder的直接转换:

private String generateSuffix(List<String[]> searches, List<String[]> sorts) {
    StringBuilder ret = new StringBuilder();
    if (searches != null && !searches.isEmpty()) {
        ret.append("where ");
        for (String[] search : searches) {
            if (search.length < 3) {
                continue;
            }
            ret.append(search[0]).append(search[1]).append(search[2]).append(" and ");
        }
        ret.delete(ret.length() - 5, ret.length());
    }

    ret.append(" order by ");
    if (sorts != null && !sorts.isEmpty()) {
        for (String[] sort : sorts) {
            if (sort.length < 2) {
                continue;
            }
            ret.append(sort[0]).append(" ").append(sort[1]).append(",");
        }
    }
    return ret.toString();
}