JAVA, массив, принимающий переменное количество объектов в качестве параметров - PullRequest
1 голос
/ 13 сентября 2010

Я пытаюсь получить массив, чтобы принимать переменное число объектов в качестве входных данных.Я новичок в программировании, поэтому заранее прошу прощения.

Вот мой код:

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 ]

3 голосов
/ 13 сентября 2010

Проблема возникает в вашем 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;
    }
}

К вашему сведению: аргумент переменной длины всегда является последним в объявленных аргументах. Подробнее о varargs здесь и здесь .

1 голос
/ 13 сентября 2010

Аргументы переменной длины (var-args) доступны как массив.Предполагая, что вы хотите объединить все рейтинги всех пользователей в один double[] в All_user, то:

<code>
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++;
            }
        }
        ...
    }
}
0 голосов
/ 13 сентября 2010

Когда вы используете нотацию vargs , arg обрабатывается как массив. В вашем случае это будет массив Rating. Вы можете ссылаться на него в теле метода, как на массив, т. Е. Как если бы он был объявлен как arguments[].

Пара критических замечаний:

  1. Вы не сможете наложить Rating на double, поэтому у вас уже есть проблемы.
  2. Что касается вашей ошибки, первое, что следует отметить, это то, что нотация ... используется только в объявлении метода, а не для ссылки на arg в теле метода.
  3. Выглядит так, как будто вы называете свой аргумент arguments, когда объявляете его как argument.
  4. Далее, вы должны добавить пробел между объявлением varg Rating... и именем аргумента.
0 голосов
/ 13 сентября 2010

argument представляется как массив Rating объектов, используемых в этом контексте. Будьте очень осторожны с использованием Varargs, хотя. Это редко - хорошее дизайнерское решение, если вы не создаете библиотеку.

...