【问题标题】:Initialize an array of references during declaration with a constructor [duplicate]在声明期间使用构造函数初始化引用数组[重复]
【发布时间】:2020-06-27 11:31:57
【问题描述】:

我有一个自定义对象Point,它的构造函数参数是Point(int x, int y)

我想要一个包含十个不同点的数组,每个点都应该使用构造函数初始化为(13, 27) 位置。

Point[] points = new Point[10];
for (Point point : points) {
    point = new Point(13, 27);
}

我不喜欢在第一行和第二行之间我有一个 nulls 数组。

我可以用我的构造函数以某种方式声明和初始化一个引用数组吗?

以下工作,但我们可以看到它的问题:

Point[] points = new Point[] {
    new Point(10, 10),
    new Point(10, 10),
    new Point(10, 10),
    /// <7 more points omitted>
};

我也想知道List 的解决方案,例如ArrayList

在 C++ 中,我会这样做,例如:std::vector&lt;Point&gt; points{10, Point{13, 27}};

编辑:我需要我的数组来保存对 10 个不同(但相等)Point 对象的引用。

【问题讨论】:

  • @SabareeshMuralidharan 不幸的是,我不是在处理原语。
  • 这个可以帮忙 Point[] points = new Point[10]; Arrays.fill(points, new Point(13, 27));
  • @Joni 重复?
  • 您是否需要 10 个不同的 Point 对象(以便您以后可以单独修改每个对象),还是需要 10 个对同一 Point 对象的引用?

标签: java arrays arraylist constructor


【解决方案1】:

您可以使用 java 流来生成您的数组:

Point[] points = Stream.generate(() -> new Point(13,27)).limit(10).toArray(Point[]::new);

【讨论】:

    【解决方案2】:

    编辑:您需要 10 个不同的对象。你可以选择Jakob Em’s stream solutionthe one by Govi S。或者,如果您可以暂时使用包含 null 值的数组:

        Point[] points = new Point[10];
        Arrays.setAll(points, index -> new Point(13, 27));
    

    对我来说,在初始化之前一直持有 nulls 似乎并没有那么糟糕,而且在幕后也发生在流解决方案中。

    我的原始答案为您提供了一个数组,其中包含 10 个对同一个 Point 对象的引用。它可能不是人们会立即期望看到的任务代码,但我认为它的可读性很好:

        Point[] points = Collections.nCopies(10, new Point(13, 27)).toArray(new Point[0]);
    

    从 Java 11 开始更加清晰:

        Point[] points = Collections.nCopies(10, new Point(13, 27)).toArray(Point[]::new);
    

    在我看来,这也与您的 C++ 方式相似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 2013-08-14
      相关资源
      最近更新 更多