Java整数列表

24

我正在尝试让Java遍历一组数字,依次选择第一个数字并输出,然后等待/暂停2000毫秒,再将下一个数字作为输出,再等待2000毫秒,如此往复。

它们不应该相互列出,所以当我的列表是:

10
20
30
40
50

它不应该输出:10 20 30 40 50,而只是50。

如果它能够重复执行,那就更好了。

到目前为止,我尝试过:

List<Integer> myCoords = new ArrayList<Integer>();
myCoords.add(10);
myCoords.add(20);
myCoords.add(30);
myCoords.add(40);
myCoords.add(50);
Iterator<Integer> myListIterator = someList.iterator(); 
while (myListIterator.hasNext()) {
    Integer coord = myListIterator.next();     
}
但这个没有计时器,而且我不确定它只会显示“20”还是“10 20 30 40 50”的输出。 我也不知道如何在其中放置一个睡眠/等待命令和一个重复命令 :s (如果已经有重复命令,我可能忽略了它)。
编辑 感谢大家,现在我可以继续编码了 :)

3
这个程序没有任何输出。 - Josh Lee
1
此外,你自相矛盾。首先说“它选择第一个,将其作为输出,...然后再将下一个作为输出”,然后又说“它不应该输出:10 20 30 40 50。而只是50。” - Brian Roach
5
他的意思是\r会倒带并重新写入该行。 - alternative
1
@mathepic - 令人印象深刻,如果没有您指出,我无法从问题中得出这一点。 - Brian Roach
5个回答

27

如果你想要重写控制台上的一行,可以打印一个控制字符 \r(回车符)。

List<Integer> myCoords = new ArrayList<Integer>();
myCoords.add(10);
myCoords.add(20);
myCoords.add(30);
myCoords.add(40);
myCoords.add(50);
Iterator<Integer> myListIterator = myCoords.iterator(); 
while (myListIterator.hasNext()) {
    Integer coord = myListIterator.next();     
    System.out.print("\r");
    System.out.print(coord);
    Thread.sleep(2000);
}

可能有点晚了,但是我刚刚开始使用列表。使用for循环,例如for(i<list.size();i++)和使用while循环和hasNext()有什么区别? - Zen
@alexsummers 这只是一种不同的访问集合元素的方法。请参阅https://dev59.com/snVD5IYBdhLWcg3wE3Ro和https://dev59.com/_nVD5IYBdhLWcg3wGXhI。 - Messa

2

代码可以运行,但输出结果是:

10
20
30
40
50

所以:

    List<Integer> myCoords = new ArrayList<Integer>();
    myCoords.add(10);
    myCoords.add(20);
    myCoords.add(30);
    myCoords.add(40);
    myCoords.add(50);
    for (Integer number : myCoords) {
        System.out.println(number);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

1

要插入一个休眠命令,您可以使用Thread.sleep(2000)。因此代码将是:

List<Integer> myCoords = new ArrayList<Integer>();
myCoords.add(10);
myCoords.add(20);
myCoords.add(30);
myCoords.add(40);
myCoords.add(50);
Iterator<Integer> myListIterator = someList.iterator(); 
while (myListIterator.hasNext()) {
    Integer coord = myListIterator.next();    
    System.out.println(coord);
    Thread.Sleep(2000);
}

这将输出: 10 20 30 40 50
如果您想要数字连在一起,您可以使用:System.out.print(coord +" " ); 如果您想要重复该部分,您可以将其放入另一个while循环中。
List<Integer> myCoords = new ArrayList<Integer>();
myCoords.add(10);
myCoords.add(20);
myCoords.add(30);
myCoords.add(40);
myCoords.add(50);
while(true)
    Iterator<Integer> myListIterator = someList.iterator(); 
    while (myListIterator.hasNext()) {
        Integer coord = myListIterator.next();    
        System.out.print(coord + " ");
        Thread.Sleep(2000);
    }
}

这将输出:10 20 30 40 50 10 20 30 40 50 ... 直到你杀死程序才会停止。
编辑:你必须将sleep命令放在try catch块中。

那么我在那段代码中改变什么,使它只重写前一个数字?与 System.out.print(coord + " "); 有关吗?还有 'try catch 块'?你刚才写的那个字符串看起来对我来说没问题 :P - JJ90
啊,就像这样:try{ Thread.sleep(2000); }catch(Exception e){ // 处理异常... }; 而不是 Thread.Sleep(2000); - JJ90
关于重写,你的意思是它正在重写先前的输出吗? - JJ90
这里涉及到“try和catch块”,因为方法“sleep”可能会抛出异常。您可以在此处了解更多信息:http://download.oracle.com/javase/tutorial/essential/exceptions/ - MByD
啊,这样它会变成:(请参见我在此问题中的第二篇帖子) - JJ90

1

让我们使用一些Java 8的特性:

IntStream.iterate(10, x -> x + 10).limit(5)
  .forEach(System.out::println);

如果您需要存储数字,可以将它们收集到一个集合中,例如:

List numbers = IntStream.iterate(10, x -> x + 10).limit(5)
  .boxed()
  .collect(Collectors.toList());

并且添加了一些延迟:

IntStream.iterate(10, x -> x + 10).limit(5)
  .forEach(x -> {
    System.out.println(x);
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      // Do something with the exception
    }  
  });

0

那么它将变成:

List<Integer> myCoords = new ArrayList<Integer>();
myCoords.add(10);
myCoords.add(20);
myCoords.add(30);
myCoords.add(40);
myCoords.add(50);
while(true)
    Iterator<Integer> myListIterator = myCoords.iterator(); 
    while (myListIterator.hasNext()) {
        Integer coord = myListIterator.next();    
        System.out.print("\r" + coord);
        try{
    Thread.sleep(2000);
  }catch(Exception e){
   // handle the exception...
  }
    }
}

为了清除之前的输出:System.out.print("\r" + coord); - Messa
哦,嗯...你认为我还能用什么方法来重写先前的结果? - JJ90
使用System.out.print(coord + " "); 而不是 System.out.print("\r" + coord);,也许会更合适? - JJ90
不是 someList. 而是你的列表 - 意味着 -> Iterator<Integer> myListIterator = myCoords.iterator(); - dantuch
你使用的操作系统是什么,打印输出到哪里了?"\r" 在 Linux/Mac 终端上可以工作(已测试),在 Windows 控制台上也应该可以工作。但如果你在某个 IDE(NetBeans、Eclipse)中查看输出,则可能无法正常工作。 - Messa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接