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;
}
答案 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();
}