JAVA,以可变数量的对象作为参数的数组

时间:2010-09-13 01:47:14

标签: java arrays object variadic-functions

我正在尝试获取一个数组,将可变数量的对象作为输入。我是编程新手,所以我提前道歉。

这是我的代码:

public class Rating{
    double [] Ratings;
    int CustomerID;
    int Domain;

    public Rating (int id, int d, double [] x) {
        double [] Ratings = x;
        int CustomerID=id;
        int Domain=d;
    }
}

public class All_user{
    double [] All_users;

    public All_user(Rating...argument) {
        double [] All_users={Rating...argument};
    }
}

但是,我得到与double [] All_users = {Rating..arguments)相关的错误;:

    Multiple markers at this line
 - Syntax error on token "...", . expected
 - arguments cannot be resolved or is 
  not a field

有什么想法?提前谢谢!

4 个答案:

答案 0 :(得分:3)

问题出现在All_user类构造函数中;您正尝试将Ratings[]类型的某些内容设置为double[]类型的类成员

您可以执行以下操作之一:

1-让All_user的构造函数接收一个数组(或可变长度参数)作为Rating的实例,并简单地将它分配给相同类型的类成员(数组):

public class All_user{
    Rating [] All_users;

    public All_user(Rating...argument) {
        All_users = argument;  // arguments is a Rating[]
    }
}

或收集每个double Ratings的所有值(Rating)并将其映射到数组

public class All_user{
    double [] All_users;

    public All_user(Rating...argument) {
        ArrayList<Double> ratings = new ArrayList<Double>();
        for (Rating r : argument) {
            for (double d : r.Ratings) ratings.add(d);
        }
        All_users = new double[ratings.size()];
        for (int i=0; i<ratings.size(); i++) All_users[i] = ratings.get(i);
    }
}

我认为后者就是你想要做的。另请注意,您的Rating课程也可以重写为

public class Rating{
    double [] Ratings;
    int CustomerID;
    int Domain;

    public Rating (int id, int d, double...x) {
        double [] Ratings = x;
        int CustomerID=id;
        int Domain=d;
    }
}

FYI:变长参数始终是声明参数中的最后一个。有关varargs herehere的更多信息。

答案 1 :(得分:1)

可变长度args(var-args)像数组一样被访问。假设您想要将所有用户的所有评分平铺到double[]中的单个All_user,那么:


public class All_user{
    double [] All_users;
    public All_user(Rating... argument) {
        int totalSize = 0;
        for(Rating r:argument)
            totalSize+=r.getRatings().length; //double[] Ratings
        double [] All_users= new double[totalSize];
        int index = 0;
        for(Rating r:argument){
            for(double r:r.getRatings()){
                 All_users[index] = r;
                 index++;
            }
        }
        ...
    }
}

答案 2 :(得分:0)

argument表示为Rating个对象的数组,在此上下文中使用。但要小心使用varargs。除非你正在建立一个图书馆,否则这很少是一个很好的设计决定。

答案 3 :(得分:0)

当您使用 vargs 表示法时,arg将作为数组处理。在您的情况下,它将是Rating的数组。您可以像在数组中一样在方法体中引用它,就好像它被声明为arguments[]一样。

一些批评:

  1. 您将无法将Rating投放到double,因此您已遇到麻烦。
  2. 关于您的错误,首先要注意的是...符号仅用于方法的声明,而不是引用方法体内的arg。
  3. 当您将其声明为arguments时,您将其视为argument
  4. 此外,您应该在varg声明Rating...和arg的名称之间添加一个空格。