最佳循环成语,用于特殊外壳的最后一个元素

2022-08-31 20:08:54

在进行简单的文本处理和打印语句时,我经常遇到这种情况,其中我正在循环访问集合,并且我想对最后一个元素进行特例处理(例如,除了最后一种情况之外,每个普通元素都将以逗号分隔)。

有没有一些最佳实践习语或优雅的形式,不需要复制代码或推入if,否则在循环中。

例如,我有一个字符串列表,我想在逗号分隔的列表中打印。(do while 解决方案已经假设列表有 2 个或更多元素,否则它将与更正确的 for 循环一样糟糕)。

例如,列表 =(“狗”,“猫”,“蝙蝠”)

我想打印“[狗,猫,蝙蝠]”

我提出2种方法

  1. 带条件的 For 循环

    public static String forLoopConditional(String[] items) {
    
    String itemOutput = "[";
    
    for (int i = 0; i < items.length; i++) {
        // Check if we're not at the last element
        if (i < (items.length - 1)) {
            itemOutput += items[i] + ", ";
        } else {
            // last element
            itemOutput += items[i];
        }
    }
    itemOutput += "]";
    
    return itemOutput;
     }
    
  2. 做而循环启动循环

    public static String doWhileLoopPrime(String[] items) {
    String itemOutput = "[";
    int i = 0;
    
    itemOutput += items[i++];
    if (i < (items.length)) {
        do {
            itemOutput += ", " + items[i++];
        } while (i < items.length);
    }
    itemOutput += "]";
    
    return itemOutput;
    }
    

    测试人员类:

    public static void main(String[] args) {
        String[] items = { "dog", "cat", "bat" };
    
        System.out.println(forLoopConditional(items));
        System.out.println(doWhileLoopPrime(items));
    
    }
    

在Java AbstractCollection类中,它具有以下实现(有点冗长,因为它包含所有边缘情况错误检查,但还不错)。

public String toString() {
    Iterator<E> i = iterator();
if (! i.hasNext())
    return "[]";

StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
    E e = i.next();
    sb.append(e == this ? "(this Collection)" : e);
    if (! i.hasNext())
    return sb.append(']').toString();
    sb.append(", ");
}
}

答案 1

我通常这样写:

static String commaSeparated(String[] items) {
    StringBuilder sb = new StringBuilder();
    String sep = "";
    for (String item: items) {
        sb.append(sep);
        sb.append(item);
        sep = ",";
    }
    return sb.toString();
}

答案 2

这些答案中有很多 for 循环,但我发现迭代器和 while 循环读取起来要容易得多。例如:

Iterator<String> itemIterator = Arrays.asList(items).iterator();
if (itemIterator.hasNext()) {
  // special-case first item.  in this case, no comma
  while (itemIterator.hasNext()) {
    // process the rest
  }
}

这是Joiner在Google集合中采用的方法,我发现它非常可读。


推荐