如何在不创建额外实例变量的情况下创建对象数组?

时间:2015-08-20 17:38:42

标签: java arrays instance-variables

我正在尝试解决以下问题:

  

实现一个名为TriangleArray的类,它具有以下内容:   不允许其他实例变量或常量。

     
      
  1. 一个名为list的实例变量,它是一个Triangle对象数组。
  2.   
  3. 不允许使用其他实例变量或常量。
  4.   
  5. 只有一个构造函数有两个整数参数。名为number的第一个参数是   列表的长度。第二个名为maxSize的参数是
  6. 允许的最大大小   
  7. 构造函数将列表初始化为Triangle对象数组。
  8.   
  9. 每个Triangle对象的边是随机生成的整数,范围从1到   MAXSIZE。
  10.   
  11. 列表的getter和setter方法。
  12.   
  13. 没有参数的最大方法。该方法返回列表中最大的三角形。
  14.   
  15. 一个toString方法,它返回列表中每个三角形的描述。
  16.   

如何在不使用其他实例变量的情况下填充完整随机对象的列表?

这是我到目前为止的代码:

import java.util.Random;
public class TriangleArray
{
  private Triangle[ ] list;
  // list is an array of "number" Triangle objects.   
  // The maximum size of each Triangle edge is "maxSize".
  public TriangleArray (int number,  int maxSize);
  {
    list = new Triangle[number];

4 个答案:

答案 0 :(得分:1)

您可以使用函数中的局部变量执行此操作。

public TriangleArray (int number,  int maxSize) {
    list = new Triangle[number];
    Random random = new Random();
    for(int i = 0; i < number; list[i] = makeRandomTriangle(random, maxSize);
}

private function makeRandomTriangle(Random random, int maxSize) {
    int a = random.nextInt(maxSize) + 1,
        b = random.nextInt(maxSize) + 1;

    // |a - b| <= c <= (a + b) because of the triangle inequality
    int min = Math.max(a - b, b - a),
        max = Math.min(maxSize, a + b);
    int c = rand.nextInt((max - min) + 1) + min;
    new Triangle(a, b, x);
}

答案 1 :(得分:0)

实例变量或字段与局部变量不同。

请参阅:What is the difference between a local variable, an instance field, an input parameter, and a class field?

您可以使用局部变量,例如:

public TriangleArray (int number,  int maxSize) {
  list = new Triangle[number];
  for(int i = 0; i < number; i++) {
    list[i] = makeTriangle(maxSize);
   }
}

private makeTriangle(maxSize) {
  Random r = new Random();

  do {
    int first = r.nextInt(maxSize - 1) + 1;
    int second = r.nextInt(maxSize - 1) + 1;
    int third = r.nextInt(maxSize - 1) + 1;

    int max = Math.max(first, Math.max(second, third));
  } while ((2 * max) - first - second - third) > 0);

  return new Triangle(first, second, third);
}

在此代码中,您永远不会创建新的实例变量。

答案 2 :(得分:0)

您无需使用实例变量来填充随机数。您可以使用java.util.RandomMath.random

list = new Triangle[number];
for (int i = 0; i < list.length; i++) {
    int a = (int)(Math.random() * (maxSize + 1));
    int b = (int)(Math.random() * (maxSize + 1));
    int c = (int)(Math.random() * (maxSize + 1));

    //handle the triangle inequality:
    while (c > a + b || c < Math.abs(a - b)) {
        c = (int)(Math.random() * (maxSize + 1));
    }

    list[i] = new Triangle(a, b, c);
}

答案 3 :(得分:0)

假设Triangle对象的构造函数如下:

public Triangle(int a, int b, int c) { ...

我们用:

初始化数组
Random r = new Random(); // random number gen
for ( int i = 0; i < number; i++ ) {
  int a = r.nextInt(maxSize-1) + 1; // randomly generate each side
  int b = r.nextInt(maxSize-1) + 1;
  int c = r.nextInt(maxSize-1) + 1; // this won't necessarily make a proper triangle
  list[i] = new Triangle(a, b, c);
}

我们必须创建一个随机数生成器,然后我们必须迭代整个未创建的三角形数组并创建它们。在迭代时,我们将每一边a,b和c随机生成一个从1到maxSize的数字,然后在当前索引处创建Triangle对象。

list是你的实例变量,同时变量a,b,c和r都是构造函数的局部变量或你放入它们的任何函数。