我找到了解决这个问题的方法,但无法弄清楚它是如何工作的。有人可以解释一下吗?
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));
}
[我无法直接评论这个答案,因为我没有足够的声望点。]
答案 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)
。答案 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));
}
}