【问题标题】:Java String ConcatenationJava 字符串连接
【发布时间】:2011-04-02 14:51:18
【问题描述】:

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

我的代码如下所示:

 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 | .....

任何人都可以帮助我修复此代码。我希望将这些值连接到一个字符串中,以便将其插入到我的数据库字段中。

【问题讨论】:

  • 您可能希望将您的代码部分包装在一个代码块中,以使其更具可读性。单击帖子下方的“编辑”,用鼠标选择代码文本,然后单击看起来像 3 x 2 块 1 和 0 的按钮(应该是左起第 5 个图标,就在引号图标之后,然后在图片图标之前。)
  • @Stephen:这些说明让我感到困惑,而不是我认为的帮助;-)
  • @Joey:也许吧,但似乎 90% 的时间都会出现一些具有编辑权限的可怜草皮,点击编辑,选择文本并单击按钮。出于某种原因,人们似乎从未探索过格式选项,即使他们必须能够看到他们的帖子看起来不……“正确”。哦,好吧。
  • 哈哈。 (为了有 15 个或更多字符)。
  • 我不确定将多条记录连接成一个长字符串放入数据库是否是个好主意。这会使查询变得非常尴尬。

标签: java string concatenation


【解决方案1】:

Thierry-Dimitri Roys 回应的补充。

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();  

【讨论】:

    【解决方案2】:

    此外,如果可以估计连接字符串的大小,您可以使用 StringBuffer(int capacity)/StringBuilder(int capacity) 来避免调整大小

    【讨论】:

      【解决方案3】:

      这是使用 String + 运算符完成您所要求的基本方法。

        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;
      

      【讨论】:

      • 对于版权声明,此来源是对@Thierry-Dimitri Roy 发布的源代码的修改响应。
      • 不,不要使用+=String 来构建字符串,那就是O(N^2)。请改用StringBuilder
      • @polygenelubricants,真的。这里有一些解决方案展示了如何使用 StringBuilder,我只是展示了替代方案。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        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();
        
            //...
        }
        

        【讨论】:

          【解决方案6】:

          试试这个:

          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();
          

          【讨论】:

          • 也可以使用 sb.append("circle:").append(longitude).append(":").append... 等 - 我相信这可能比使用 " +" 连接符。
          • 那是什么?一起使用StringBuilder+。为什么不使用+ 而不使用StringBuilder? (或者如果您需要优化,只需 StringBuilder
          • 这一切都应该像 Lunivore 建议的那样被分解。不要混合使用 StringBuilder.append 和 + 运算符。 StringBuilder 提供优化,并将它们与 + 运算符混合使用有点违背目的。
          • @Lunivore,@Carlos,@Erick,我不同意。 @Lunivore:AFAIK 在 Java 中,这种 + 无论如何都是使用隐藏的 StringBuilder 实现的。 @Carlos,@Erick:优化在小字符串上并不重要。在这个例子中,在 sb.append() 中使用 + 是一件好事,因为在一个地方优化的可读性并不是真正需要的。对全局字符串使用 StringBuilder 有利于在有用的地方进行优化。而且以这种方式混合 + 和 StringBuilder 完全没有逻辑上的不兼容(否则我会说 StringBuilder 太不安全了......)
          • @fred-hh 我说得再好不过了。我更喜欢 StringBuilder 用于迭代和“+”,它更具可读性。
          【解决方案7】:

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

          String value = string1 + string2 + string3;
          

          还有其他方法可以做到这一点,但这个简单的案例应该可以满足您的需求。如需更多信息,请查看StringBuilder

          【讨论】:

            猜你喜欢
            • 2013-05-22
            • 1970-01-01
            • 1970-01-01
            • 2012-08-28
            • 2015-07-31
            • 2011-07-22
            相关资源
            最近更新 更多