显示1到100没有循环或递归

时间:2016-05-27 13:40:13

标签: java

我找到了解决这个问题的方法,但无法弄清楚它是如何工作的。有人可以解释一下吗?

public static void main(String[] args) {
Object[] numbers = new Object[100];
Arrays.fill(numbers, new Object() {
    private int count = 0;
    @Override
    public String toString() {
        return Integer.toString(++count);
    }
});
System.out.println(Arrays.toString(numbers));
}

[我无法直接评论这个答案,因为我没有足够的声望点。]

5 个答案:

答案 0 :(得分:4)

  

有人可以解释一下吗?

此代码是

的用法

Arrays.fill(Object[] a, Object val)

提供的对象val是一个匿名类,其toString()方法被覆盖。

Arrays.toString(numbers)为a数组中的每个元素调用匿名类上的toString()。当重写toString()以递增计数时,每次调用时都会获得递增的值。

然而,正如@Eran指出的那样,它并非没有循环。

答案 1 :(得分:3)

准确地说,Arrays.fill()在自己的实现中使用循环。 通常,Arrays.fill通过将第二个参数分配给第一个参数(您的数组)的每个元素来填充数组。

您的示例的Array类型为Object,长度为100个元素。 在Arrays.fill(...)中,您生成一个所谓的Object类型的匿名类,它通过增加计数器(toString)的值来重新实现int count - 方法,并在此之后打印它。

现在,通过调用Arrays.toString,执行数组中每个元素的toString()方法(这里是匿名类的相同实例),从而导致打印1-100的数字< / p>

答案 2 :(得分:2)

System.out.println(1)
System.out.println(2)
System.out.println(3)
System.out.println(4)
System.out.println(5)
System.out.println(6)
System.out.println(7)
...
System.out.println(100)

:d

为了避免Dmitry提出的代码生成器,只需复制粘贴

就可以轻松完成
int i=0;
System.out.println(++i);
System.out.println(++i);
System.out.println(++i);
System.out.println(++i);
System.out.println(++i);
...
System.out.println(++i);
  • 写一次System.out.println(++i)
  • 复制并粘贴4次。
  • 然后你挑选那5行并再次粘贴它们。
  • 你现在应该有10倍的线。选择那10行并复制粘贴9次。
  • 完成!

答案 3 :(得分:1)

这是一个更好的解决方案:

IntStream.rangeClosed(0, 100).forEach(System.out::println);

我认为这是自我解释的

答案 4 :(得分:0)

这个怎么样:

public class NoLoopPrint {

    int max;
    int from;

    public NoLoopPrint(int max) {
        this(1, max);
    }

    public NoLoopPrint(int from, int max) {
        this.max = max;
        this.from = from;
    }

    public String toString() {
        if (from >= max) {
            return String.valueOf(max);
        }
        System.out.println(from++);
        return this.toString();
    }

    public static void main(String args[]) {
        System.out.println(new NoLoopPrint(100));
        System.out.println(new NoLoopPrint(10, 20));
    }
}