Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中增强for循环的最后一次迭代_Java_For Loop_Foreach_Conditional Execution - Fatal编程技术网

java中增强for循环的最后一次迭代

java中增强for循环的最后一次迭代,java,for-loop,foreach,conditional-execution,Java,For Loop,Foreach,Conditional Execution,是否有方法确定循环是否在最后一次迭代。我的代码如下所示: int[] array = {1, 2, 3...}; StringBuilder builder = new StringBuilder(); for(int i : array) { builder.append("" + i); if(!lastiteration) builder.append(","); } 现在的问题是,我不想在上一次迭代中附加逗号。现在有一种方法可以确定它是最后一次迭代,还

是否有方法确定循环是否在最后一次迭代。我的代码如下所示:

int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();

for(int i : array)
{
    builder.append("" + i);
    if(!lastiteration)
        builder.append(",");
}

现在的问题是,我不想在上一次迭代中附加逗号。现在有一种方法可以确定它是最后一次迭代,还是我一直在使用for循环,或者使用外部计数器来跟踪。

总是附加可能更容易。然后,完成循环后,只需删除最后一个角色。这样的条件也少了很多


您可以使用
StringBuilder
deleteCharAt(int-index)
,索引为
length()-1

,如果您将其转换为经典索引循环,则可以

或者,您可以在完成后删除最后一个逗号。像这样:

int[] array = {1, 2, 3...};
StringBuilder

builder = new StringBuilder();

for(int i : array)
{
    builder.append(i + ",");
}

if(builder.charAt((builder.length() - 1) == ','))
    builder.deleteCharAt(builder.length() - 1);

我,我只使用from。

保持简单,并使用循环标准:

for(int i = 0 ; i < array.length ; i ++ ){
    builder.append(array[i]);
    if( i != array.length - 1 ){
        builder.append(',');
    }
}
for(int i=0;i

或者直接使用apache,显式循环总是比隐式循环工作得更好

builder.append( "" + array[0] );
for( int i = 1; i != array.length; i += 1 ) {
   builder.append( ", " + array[i] );
}

您应该将整个内容包装在if语句中,以防处理的是零长度数组。

另一种选择是在追加i之前追加逗号,而不是在第一次迭代时。(顺便说一句,请不要使用
“”+i
,您在这里并不真正需要连接,而且StringBuilder有一个非常好的附加(int)重载。)


这样做的好处是,它可以与任何
Iterable
一起使用-您不能总是对事物进行索引。(当您真正使用StringBuilder时,“添加逗号,然后在末尾删除它”是一个很好的建议,但它不适用于写入流之类的事情。不过,这可能是解决这个确切问题的最佳方法。)

另一种方法是将数组的长度(如果可用)存储在单独的变量中(比每次重新检查长度更有效)。然后可以将索引与该长度进行比较,以确定是否添加最后一个逗号

编辑:另一个考虑因素是权衡删除最终字符(可能导致字符串复制)与在每次迭代中检查条件字符串的性能成本。

以下是一个解决方案:

int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
bool firstiteration=true;

for(int i : array)
{
    if(!firstiteration)
        builder.append(",");

    builder.append("" + i);
    firstiteration=false;
}
查找第一次迭代:)

此处有两条备用路径:

1:


2:首先将名为
的布尔值设置为true。在每次迭代中,如果
first
为false,则添加逗号;然后,将
first
设置为false。

可能您使用了错误的工具进行作业

这比你正在做的更像是手工操作,但如果不是有点“老派”的话,它在某种程度上更优雅

另一种解决方案(可能是最有效的)

int[]数组={1,2,3};
StringBuilder=新的StringBuilder();
如果(array.length!=0){
append(数组[0]);
for(int i=1;i
另一种方法:

String delim = "";
for (int i : ints) {
    sb.append(delim).append(i);
    delim = ",";
}

更新:对于Java8,您现在有了

如果您只是将数组转换为逗号分隔的数组,那么许多语言都有一个连接函数来实现这一点。它将数组转换为字符串,每个元素之间都有一个分隔符。

您需要


分隔符
的实现非常简单。它包装每次调用
toString()
时返回的字符串,但第一次调用除外,该调用返回空字符串。

基于java.util.AbstractCollection.toString(),它会提前退出以避免使用分隔符

StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
for (;;) {
  buffer.append(iter.next());
  if (! iter.hasNext())
    break;
  buffer.append(delimiter);
}
它既高效又优雅,但不像其他一些答案那样不言自明。

又是另一种选择

StringBuilder builder = new StringBuilder();
for(int i : array)
    builder.append(',').append(i);
String text = builder.toString();
if (text.startsWith(",")) text=text.substring(1);

这几乎是重复的。您需要的是StringUtils,并调用join方法

StringUtils.join(strArr, ',');

这里描述的许多解决方案都有点过头了,尤其是那些依赖外部库的解决方案。有一个很好的、干净、清晰的习惯用法,用于实现我一直使用的逗号分隔列表。它依赖于条件(?)运算符:

编辑:原始解决方案正确,但根据评论为非最优。第二次尝试:

    int[] array = {1, 2, 3};
    StringBuilder builder = new StringBuilder();
    for (int i = 0 ;  i < array.length; i++)
           builder.append(i == 0 ? "" : ",").append(array[i]); 
int[]数组={1,2,3};
StringBuilder=新的StringBuilder();
for(int i=0;i

这是4行代码,包括数组和StringBuilder的声明。

在本例中,实际上不需要知道它是否是最后一次重复。 我们有很多方法可以解决这个问题。一种方法是:

String del = null;
for(int i : array)
{
    if (del != null)
       builder.append(del);
    else
       del = ",";
    builder.append(i);
}

以下是我运行的SSCCE基准测试(与我必须实现的内容相关),结果如下:

elapsed time with checks at every iteration: 12055(ms)
elapsed time with deletion at the end: 11977(ms)
至少在我的例子中,在每次迭代中跳过检查并没有明显的更快,特别是对于正常的数据量,但是它更快

import java.util.ArrayList;
import java.util.List;


public class TestCommas {

  public static String GetUrlsIn(int aProjectID, List<String> aUrls, boolean aPreferChecks)
  {

    if (aPreferChecks) {

      StringBuffer sql = new StringBuffer("select * from mytable_" + aProjectID + " WHERE hash IN ");

      StringBuffer inHashes = new StringBuffer("(");
      StringBuffer inURLs = new StringBuffer("(");

      if (aUrls.size() > 0)
      {

      for (String url : aUrls)
      {

        if (inHashes.length() > 0) {
        inHashes.append(",");
        inURLs.append(",");
        }

        inHashes.append(url.hashCode());

        inURLs.append("\"").append(url.replace("\"", "\\\"")).append("\"");//.append(",");

      }

      }

      inHashes.append(")");
      inURLs.append(")");

      return sql.append(inHashes).append(" AND url IN ").append(inURLs).toString();
    }

    else {

      StringBuffer sql = new StringBuffer("select * from mytable" + aProjectID + " WHERE hash IN ");

      StringBuffer inHashes = new StringBuffer("(");
      StringBuffer inURLs = new StringBuffer("(");

      if (aUrls.size() > 0)
      {

      for (String url : aUrls)
      {
        inHashes.append(url.hashCode()).append(","); 

        inURLs.append("\"").append(url.replace("\"", "\\\"")).append("\"").append(",");
      }

      }

      inHashes.deleteCharAt(inHashes.length()-1);
      inURLs.deleteCharAt(inURLs.length()-1);

      inHashes.append(")");
      inURLs.append(")");

      return sql.append(inHashes).append(" AND url IN ").append(inURLs).toString();
    }

  }

  public static void main(String[] args) { 
        List<String> urls = new ArrayList<String>();

    for (int i = 0; i < 10000; i++) {
      urls.add("http://www.google.com/" + System.currentTimeMillis());
      urls.add("http://www.yahoo.com/" + System.currentTimeMillis());
      urls.add("http://www.bing.com/" + System.currentTimeMillis());
    }


    long startTime = System.currentTimeMillis();
    for (int i = 0; i < 300; i++) {
      GetUrlsIn(5, urls, true);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("elapsed time with checks at every iteration: " + (endTime-startTime) + "(ms)");

    startTime = System.currentTimeMillis();
    for (int i = 0; i < 300; i++) {
      GetUrlsIn(5, urls, false);
    }
    endTime = System.currentTimeMillis();
    System.out.println("elapsed time with deletion at the end: " + (endTime-startTime) + "(ms)");
  }
}
import java.util.ArrayList;
导入java.util.List;
公共类测试逗号{
公共静态字符串GetUrlsIn(int-aProjectID、List-aUrls、boolean-aPreferChecks)
{
如果(预先检查){
StringBuffer sql=new StringBuffer(“从mytable_u2;中选择*”+aProjectID+“其中散列”);
StringBuffer inHash=新的StringBuffer(“”);
StringBuffer inURLs=新的StringBuffer(“”);
如果(aUrls.size()>0)
{
for(字符串url:aUrls)
{
如果(inhash.length()>0){
在后面加上“,”;
inURLs.追加(“,”);
}
append(url.hashCode());
inURLs.append(“\”).append(url.replace(“\”,“\\\”).append(“\”);/.append(,”;
}
}
在后面加上(“)”;
inURLs.追加(“)”;
返回sql.append(inhash.append(“AND url IN”).append(inURLs.toString());
}
否则{
StringBuffer sql=new StringBuffer(“从mytable中选择*”+aProjectID+“其中包含哈希”);
一串
    int[] array = {1, 2, 3};
    StringBuilder builder = new StringBuilder();
    for (int i = 0 ;  i < array.length; i++)
           builder.append(i == 0 ? "" : ",").append(array[i]); 
String del = null;
for(int i : array)
{
    if (del != null)
       builder.append(del);
    else
       del = ",";
    builder.append(i);
}
elapsed time with checks at every iteration: 12055(ms)
elapsed time with deletion at the end: 11977(ms)
import java.util.ArrayList;
import java.util.List;


public class TestCommas {

  public static String GetUrlsIn(int aProjectID, List<String> aUrls, boolean aPreferChecks)
  {

    if (aPreferChecks) {

      StringBuffer sql = new StringBuffer("select * from mytable_" + aProjectID + " WHERE hash IN ");

      StringBuffer inHashes = new StringBuffer("(");
      StringBuffer inURLs = new StringBuffer("(");

      if (aUrls.size() > 0)
      {

      for (String url : aUrls)
      {

        if (inHashes.length() > 0) {
        inHashes.append(",");
        inURLs.append(",");
        }

        inHashes.append(url.hashCode());

        inURLs.append("\"").append(url.replace("\"", "\\\"")).append("\"");//.append(",");

      }

      }

      inHashes.append(")");
      inURLs.append(")");

      return sql.append(inHashes).append(" AND url IN ").append(inURLs).toString();
    }

    else {

      StringBuffer sql = new StringBuffer("select * from mytable" + aProjectID + " WHERE hash IN ");

      StringBuffer inHashes = new StringBuffer("(");
      StringBuffer inURLs = new StringBuffer("(");

      if (aUrls.size() > 0)
      {

      for (String url : aUrls)
      {
        inHashes.append(url.hashCode()).append(","); 

        inURLs.append("\"").append(url.replace("\"", "\\\"")).append("\"").append(",");
      }

      }

      inHashes.deleteCharAt(inHashes.length()-1);
      inURLs.deleteCharAt(inURLs.length()-1);

      inHashes.append(")");
      inURLs.append(")");

      return sql.append(inHashes).append(" AND url IN ").append(inURLs).toString();
    }

  }

  public static void main(String[] args) { 
        List<String> urls = new ArrayList<String>();

    for (int i = 0; i < 10000; i++) {
      urls.add("http://www.google.com/" + System.currentTimeMillis());
      urls.add("http://www.yahoo.com/" + System.currentTimeMillis());
      urls.add("http://www.bing.com/" + System.currentTimeMillis());
    }


    long startTime = System.currentTimeMillis();
    for (int i = 0; i < 300; i++) {
      GetUrlsIn(5, urls, true);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("elapsed time with checks at every iteration: " + (endTime-startTime) + "(ms)");

    startTime = System.currentTimeMillis();
    for (int i = 0; i < 300; i++) {
      GetUrlsIn(5, urls, false);
    }
    endTime = System.currentTimeMillis();
    System.out.println("elapsed time with deletion at the end: " + (endTime-startTime) + "(ms)");
  }
}
String joined = array.stream().map(Object::toString).collect(Collectors.joining(", "));
int nums[] = getNumbersArray();
StringBuilder builder = new StringBuilder();

// non enhanced version
for(int i = 0; i < nums.length; i++){
   builder.append(nums[i]);
   if(i < nums.length - 1){
       builder.append(",");
   }   
}

//using iterator
Iterator<int> numIter = Arrays.asList(nums).iterator();

while(numIter.hasNext()){
   int num = numIter.next();
   builder.append(num);
   if(numIter.hasNext()){
      builder.append(",");
   }
}