Java foreach和hasNext

时间:2015-07-01 02:19:52

标签: java

我正在尝试遍历Objects的ArrayList。对于每个Object,我想调用它的toString()方法,然后用逗号分隔它们来连接它们。

我有一些测试代码,但它没有像我期望的那样表现。我得到的以下代码的输出是:Adam, Bob, Catherine, Dylan,当我想要的是Adam, Bob, Catherine, Dylan时(姓氏不应该有一个逗号继续它。)

public static void main2 (){
    //ArrayList of Strings rather than Objects for simplicity
    ArrayList<String> test = new ArrayList<String>(Arrays.asList("Adam", "Bob", "Catherine", "Dylan"));

    String output = new String();
    for (String str : test) {
        output += str.toString();
        output += test.iterator().hasNext() ? ", " : "";
    }

    System.out.println(output);
}

4 个答案:

答案 0 :(得分:4)

  • 只需单独使用迭代器,而不是每个&#39; for-each;环
  • 仅当迭代器具有下一个元素
  • 时才附加,

示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class QuickTester {

    public static void main(String[] args) {

        ArrayList<String> test = 
                new ArrayList<String>(Arrays.asList(
                        "Adam", "Bob", "Catherine", "Dylan"));

        StringBuilder sb = new StringBuilder();
        Iterator<String> stringIterator = test.iterator();
        while(stringIterator.hasNext()) {

            sb.append(stringIterator.next());

            if(stringIterator.hasNext()) {
                sb.append(", ");
            }
        }

        System.out.println(sb.toString());
    }
}

<强>输出:

Adam, Bob, Catherine, Dylan


在问题中,对于行

output += test.iterator().hasNext() ? ", " : "";
  • test.iterator()返回指向第一个元素的迭代器
  • 因为有4个元素,hasNext()将永远为真
  • 解释了输出不符合预期的原因
  • 此外,单独使用迭代器就足够了,不需要同时使用它们。和迭代器。

注意:StringBuilder用于此类事情是件好事。 :)

答案 1 :(得分:3)

更新

使用Java8,您可以将String.Join()ArrayList Object一起使用。

public static void main(String[] args) throws Exception {
    ArrayList<MyClass> test = new ArrayList();
    test.add(new MyClass("Adam", 12));
    test.add(new MyClass("Bob", 17));
    test.add(new MyClass("Catherine", 19));
    test.add(new MyClass("Dylan", 22));

    System.out.println(String.join(", ", test.stream().map(mc -> mc.Name).collect(Collectors.toList())));
}

public static class MyClass {
    public String Name;
    public int Age;

    public MyClass(String n, int a) {
        this.Name = n;
        this.Age = a;
    }
}

结果:

Adam, Bob, Catherine, Dylan

OLD ANSWER

为什么不使用String.Join()

public static void main(String[] args) throws Exception {
    ArrayList<String> test = 
            new ArrayList<String>(Arrays.asList(
                    "Adam", "Bob", "Catherine", "Dylan"));

    System.out.println(String.join(", ", test));
}

结果:

Adam, Bob, Catherine, Dylan

答案 2 :(得分:0)

试试这个

public static void main(String[] args) {
        // ArrayList of Strings rather than Objects for simplicity
        ArrayList<String> test = new ArrayList<String>(Arrays.asList("Adam",
                "Bob", "Catherine", "Dylan"));
        int size = test.size();
        String output = new String();
        for (String str : test) {
            output += str.toString();
                output += test.lastIndexOf(str) < size - 1 ? ", " : "";
        }

        System.out.println(output);
    }

答案 3 :(得分:0)

使用这种单线

SELECT TOP (1) WITH TIES m.*
FROM missions m
ORDER BY DATEDIFF(year, m.launchdate, m.recoverydate) DESC;