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

Dou*_*kem 48 java loops idioms while-loop

我在做简单的文本处理和打印语句时经常遇到这种情况,我循环一个集合,我想要特殊情况下的最后一个元素(例如,除了最后一个例子,每个普通元素都将以逗号分隔).

是否有一些最佳实践习惯或优雅的形式,不需要复制代码或在if循环中推..

例如,我有一个字符串列表,我想在逗号分隔列表中打印.(虽然解决方案已经假设列表中有2个或更多元素,否则它就像使用条件的更正确的循环一样糟糕).

例如List =("dog","cat","bat")

我想打印"[狗,猫,蝙蝠]"

我提出了两种方法

  1. 对于有条件的循环

    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;
     }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    测试者类:

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

在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(", ");
}
}
Run Code Online (Sandbox Code Playgroud)

fin*_*nnw 43

我通常这样写:

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();
}
Run Code Online (Sandbox Code Playgroud)

  • @Peavers 它在项目之前附加分隔符。分隔符是第一个循环的空字符串。 (2认同)

gk5*_*885 24

这些答案中有很多for循环,但我发现Iterator和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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 以逗号分隔的列表可以被视为带有逗号的项目,除了最后一个或除了第一个之外的每个之前带有逗号的项目.该解决方案选择后者. (3认同)
  • 我不明白这是如何工作的。我们要删除最后一个逗号,而不是第一个。第一项不是特例。 (2认同)

Jer*_*ing 14

string value = "[" + StringUtils.join( items, ',' ) + "]";
Run Code Online (Sandbox Code Playgroud)


小智 7

我通常的做法是测试索引变量是否为零,例如:

var result = "[ ";
for (var i = 0; i < list.length; ++i) {
    if (i != 0) result += ", ";
    result += list[i];
}
result += " ]";
Run Code Online (Sandbox Code Playgroud)

但是,当然,只有当我们谈论没有一些Array.join(",")方法的语言时才会这样.;-)


Jac*_*maw 6

我认为将第一个元素视为特殊情况更容易,因为更容易知道迭代是第一个而不是最后一个.它不需要任何复杂或昂贵的逻辑来知道第一次是否正在做某事.

public static String prettyPrint(String[] items) {
    String itemOutput = "[";
    boolean first = true;

    for (int i = 0; i < items.length; i++) {
        if (!first) {
            itemOutput += ", ";
        }

        itemOutput += items[i];
        first = false;
    }

    itemOutput += "]";
    return itemOutput;
}
Run Code Online (Sandbox Code Playgroud)