2010-08-23 49 views
2

我的Java代码有问题。我昨天也问过同样的问题。我得到了答案,但很抱歉,这是我的错。我的问题不清楚。Java String Concatenation

我的代码如下所示:

for(i = 0; i < geo.getTargets().length ; i++) 
    { 
     if(geo.getTargets(i).getTargetType().equalsIgnoreCase("ProximityTarget")) 
     { 
      final ProximityTarget prox = (ProximityTarget)geo.getTargets(i); 
      prox.getGeoPoint().getLatitudeInMicroDegrees(); 
      prox.getGeoPoint().getLongitudeInMicroDegrees(); 
      prox.getRadiusDistanceUnits(); 
     } 
    } 

以上三种方法给我一些价值观。

我想这些数值是发生在这个格式:

circle:long:lat:radius | circle:long:lat:radius | ..... 

任何一个可以帮助我解决这个代码。我希望这些值被串联在一个字符串中,以便将其插入到我的数据库字段中。

+0

您可能想要将代码部分包装在代码块中,以便更易读。点击您的帖子下方的“编辑”,用鼠标选择代码文本,然后点击看起来像3乘2块1和0的按钮(应该是左侧第5个图标,就在引号图标后面, ) – Stephen 2010-08-23 12:10:30

+0

@Stephen:这些说明让我感到困惑的不止是他们会帮我想的;-) – Joey 2010-08-23 12:13:58

+0

@Joey:或许,但它似乎只有90%的时间,一些可怜的编辑权的草皮必须来沿着,点击编辑,选择文本并点击按钮。出于某种原因,人们似乎从未探索过格式化选项,即使他们必须能够看到他们的帖子看起来不对......“正确”。好吧。 – Stephen 2010-08-23 12:21:52

回答

4

这是使用字符串+运算符进行所要求的基本方法。

String result = ""; 
    for(i = 0; i < geo.getTargets().length ; i++){ 
     if(geo.getTargets(i).getTargetType().equalsIgnoreCase("ProximityTarget")){ 
     final ProximityTarget prox = (ProximityTarget)geo.getTargets(i); 
     float longitude = prox.getGeoPoint().getLatitudeInMicroDegrees()); 
     float lat = prox.getGeoPoint().getLongitudeInMicroDegrees()); 
     float radius = prox.getRadiusDistanceUnits(); 

     if (!result.isEmpty()) { 
      result += "|"; 
     } 

     result += ("circle:" + longitude + ":" + lat + ":" + radius); 
     } 
    } 

    return result; 
+0

有关版权声明,此源码由@ Thierry-Dimitri Roy发布源代码修改后的响应。 – 2010-08-23 12:56:51

+1

不,不要使用'+ ='和'String'来构建字符串,即'O(N^2)'。改用'StringBuilder'。 – polygenelubricants 2010-08-23 13:25:15

+0

@ polygenelubricants,是。这里有解决方案,显示如何使用StringBuilder,我只是显示替代方案。 – 2010-08-23 13:31:26

1

执行Java字符串拼接的最基本方法是使用+运算符。设置:

String value = string1 + string2 + string3; 

还有其他方法可以做到这一点,但这种简单的情况下应该能够满足您的需求。欲了解更多信息,请查看StringBuilder

5

试试这个:

StringBuilder sb = new StringBuilder(); 
for(i = 0; i < geo.getTargets().length ; i++){ 
    if(geo.getTargets(i).getTargetType().equalsIgnoreCase("ProximityTarget")){ 
    final ProximityTarget prox = (ProximityTarget)geo.getTargets(i); 
    float longitude = prox.getGeoPoint().getLatitudeInMicroDegrees()); 
    float lat = prox.getGeoPoint().getLongitudeInMicroDegrees()); 
    float radius = prox.getRadiusDistanceUnits(); 

    if (sb.isEmpty()) { 
     sb.append("circle:" + longitude + ":" + lat + ":" + radius); 
    else { 
     sb.append(" | circle:" + longitude + ":" + lat + ":" + radius); 
    } 
    } 
} 
String result = sb.toString(); 
+5

也可以使用sb.append(“circle:”)。append(longitude).append(“:”)。append ...等等 - 我相信这可能比使用“+”连接符更高效。 – Lunivore 2010-08-23 12:19:00

+3

那是什么?同时使用'StringBuilder'和'+'。为什么不使用'+'而不使用'StringBuilder'? (或者只是'StringBuilder',如果你需要这种优化) – 2010-08-23 12:22:58

+2

这应该像Lunivore建议的那样全部被分解。不要混合StringBuilder.append和+运算符。 StringBuilder提供了优化,并将它们与+运算符混合在一起就会失败。 – 2010-08-23 12:37:17

2
public String asString(ProximityTarget target) { 
    StringBuilder sb = new StringBuilder("circle:"); 
    sb.append(target.getGeoPoint().getLatitudeInMicroDegrees()).append(":"); 
    sb.append(target.getGeoPoint().getLongitudeInMicroDegrees()).append(":"); 
    sb.append(target.getRadiusDistanceUnits()); 
    return sb.toString(); 
} 

public void someMethod() { 
    //... 
    StringBuilder sb = new StringBuilder(); 
    for(i = 0; i < geo.getTargets().length ; i++) 
    { 
     if(geo.getTargets(i).getTargetType().equalsIgnoreCase("ProximityTarget")) 
     { 
      final ProximityTarget prox = (ProximityTarget)geo.getTargets(i); 

      if (!sb.isEmpty()) 
       sb.append("|"); 

      sb.append(asString(prox)); 
     } 
    } 
    String formattedString = sb.toString(); 

    //... 
} 
0

取决于你在那种环境。如果你不需要线程安全,请使用stringbuilder。 stringbuffer类在需要时提供必要的同步。

0

而且,如果能够估计连接字符串的大小,你可以用StringBuffer(INT容量)/ StringBuilder的(INT容量),以避免调整

0

添置蒂埃里 - 迪米特里·鲁瓦响应。

StringBuilder sb = new StringBuilder(); 
ProximityTarget prox; 
float latitude; 
float longitude; 
float radius; 

//Use for-each if you process all elements 
for(Target target : geo.getTargets()){ 

    //Use literal string first to avoid NullPointerException 
    if("ProximityTarget".equalsIgnoreCase(target.getTargetType())){ 
    prox  = (ProximityTarget)geo.getTargets(i); 
    latitude = prox.getGeoPoint().getLatitudeInMicroDegrees()); 
    longitude = prox.getGeoPoint().getLongitudeInMicroDegrees()); 
    radius  = prox.getRadiusDistanceUnits(); 

    //Checking sb every loop is not a good practice. 
    //Instead try removing first delimeter after for-loop 
    sb.append("|circle:" + longitude + ":" + latitude + ":" + radius); 
    } 
} 

//AFAIK StringBuilder has no isEmpty Method. 
//So use length method 
if (sb.length() > 0){ 
    sb.deleteCharAt(0); 
} 

String result = sb.toString();