2010-08-23 47 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();