【问题标题】:JAVA, array taking a variable number of objects as parametersJAVA,以可变数量的对象为参数的数组
【发布时间】:2010-09-13 01:47:13
【问题描述】:

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

这是我的代码:

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

有什么想法吗?提前致谢!

【问题讨论】:

  • 变量名应该是 camelCase:Ratings -> Ratings,CustomerID -> customerID(有些更喜欢 customerId)并且你不应该在类名中使用下划线:All_users -> AllUsers。试着习惯它,它会让你的生活更轻松。快速说明:如果参数定义为 Rating... rating (varargs),则参数 rating 是 Ratings[] 的类型。

标签: java arrays object variadic-functions


【解决方案1】:

问题出在您的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[]
    }
}

或从每个 Rating 收集所有值 (double Ratings) 并将它们映射到一个数组中

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;
    }
}

仅供参考:可变长度参数始终是声明参数中的最后一个。更多关于可变参数herehere

【讨论】:

  • double等基元在Java中不能是泛型类型arg。
  • 该死!有一段时间没有做Java了……它没有想象中的那么漂亮,但我解决了这个问题。谢谢。
【解决方案2】:

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


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++;
            }
        }
        ...
    }
}

【讨论】:

    【解决方案3】:

    argument 表示为Rating 对象的数组,在此上下文中使用。不过要非常小心使用可变参数。除非您正在制作库,否则这很少是一个好的设计决策。

    【讨论】:

      【解决方案4】:

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

      几个评论:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-21
        • 2012-11-28
        • 2013-03-06
        • 1970-01-01
        • 2018-04-15
        • 2021-07-29
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多