Попытка создать класс, содержащий объекты из другого класса - PullRequest
0 голосов
/ 08 января 2020

Я создал класс с именем Album, который выглядит следующим образом:

public class Album {

    private String Titulo;
    private int temas;
    private int ano;

    public Album(String Titulo2, int temas2, int ano2) {
        this.Titulo = Titulo2;
        this.temas = temas2;
        this.ano = ano2;
    }

    public Album(String Titulo2, int temas2) {
        this.Titulo = Titulo2;
        this.temas = temas2;
    }

    public int getAno() {
        return this.ano;
    }

    public int getTemas() {
        return this.temas;
    }

    public String getTitulo() {
        return this.Titulo;
    }

    public void setAno(int ano) {
        this.ano = ano;
    }

    public boolean foiEditadoNesteSeculo() {
        if (this.ano > 2000) {
            return true;
        } else {
            return false;
        }
    }

    public void adicionaTemasBonus(int x) {
        this.temas += x;
    }

    public void mostraAlbum() {
        System.out.println(this.Titulo + " (editado em " + this.ano + "; tem " + this.temas + " temas)");
    }
}

Он отлично работает. Проблема в том, что учитель попросил меня создать новый класс с именем Band, и он должен иметь массив альбомов. Объект Band должен быть объявлен с int, который представляет ограничение количества альбомов (длина массива). У меня уже есть представление о том, как работать с массивами, но я не знаю, как создать тип массива, который содержит объекты из другого класса, и после того, как использовать атрибуты объектов для возврата чего-либо. Я думаю, что смогу выяснить остальное после того, как смогу правильно создать класс.

Извинения, как это было описано на португальском языке, и у меня нет большого опыта в переводе.

Ответы [ 4 ]

1 голос
/ 08 января 2020
public class Band {
    private Album[] albums;
    private numberOfAlbums;
    //...

    // create an empty constructor
    Band(){
        albums = new Album[];
        numberOfAlbums = 0;
    }
    // constructor that receives the albums
    Band(Album[] albums){
        this.albums = albums;
        this.numberOfAlbums = albums.length;
    }

    // constructor that receives the number of albums
    Band(int numOfAlbums){
        this.numberOfAlbums = numOfAlbums;
        this.albums = new Album[numOfAlbums];
    }

    // add getters and setters
    // example of adding a new album
    public void addNewAlbum(Album album){
        if(this.numOfAlbums == this.albums.length){
            // you need to create a new array with a bigger size, copy the existing data and insert the album
            // or whatever you'd like
        } else {
             this.albums[this.numOfAlbums] = album;
             // increment the numOfAlbums
             this.numOfAlbums++;
        }
    }
}

private class Album {
    //...
}
1 голос
/ 08 января 2020

По-моему, с List было бы проще управлять, поэтому вы можете добавить столько Albums, сколько захотите, однако, поскольку для постановки задачи требуется Array Я сделал пример Band класс.

Я также включил метод main для проверки программы в нижней части класса Band:

public class Band {
    private int totalAlbums;
    private Album[] albums;
    private int currentNumberOfAlbums;

    public Band(int totalAlbums) {
        this.totalAlbums = totalAlbums;
        this.albums = new Album[totalAlbums];
        this.currentNumberOfAlbums = 0;
    }

    public Band(Album[] albums) {
       this.totalAlbums = albums.length;
       this.albums = albums;
       this.currentNumberOfAlbums = this.totalAlbums;
    }

    public void addNewAlbum(String titulo, int temas, int ano) {
        if (this.currentNumberOfAlbums == totalAlbums) {
            System.out.println("Warning: Cannot add any more albums, limit reached.");
            return;
        }
        this.albums[this.currentNumberOfAlbums++] = new Album(titulo, temas, ano);

    }

   public void printAlbums() {
       for (Album a : this.albums) {
           a.mostraAlbum();
       }
   }

    public static void main(String [] args) {
        Band b = new Band(3);
        b.addNewAlbum("The First", 4, 2001);
        b.addNewAlbum("The Second", 98, 2055);
        b.addNewAlbum("The Finale", 12, 2011);
        b.addNewAlbum("The Extra", 12, 2111);

        b.printAlbums();
    }
}

В этом коде есть несколько вещей, которые нужно искать.

Во-первых, для решения вашего прямого вопроса вы можете просто использовать пользовательский класс в качестве массива, как любой другой класс / примитив с Album[].

Во-вторых, вам потребуется Band конструктор, который создает массив Album на основе переданного ему целого числа, чтобы вы знали, сколько альбомов ограничено. Вы можете увидеть это с помощью строки this.albums = new Album[totalAlbums];.

Далее вам нужен способ добавить новый Album в массив Album[]. Это можно сделать несколькими различными способами, но я выбрал способ addNewAlbum(String, int, int), чтобы сделать это для этого примера, который также будет увеличивать currentNumberOfAlbums на 1 каждый раз, когда добавляется новый альбом. Это полезно, чтобы вы знали, когда Album пытаются добавить, даже если totalAlbums уже заполнены! Это предотвратит ArrayIndexOutOfBoundsException в вашем коде, если addNewAlbum вызывается слишком много раз.

Наконец, в addNewAlbum вам нужно вызвать ваш Album конструктор с помощью new Album(titulo, temas, ano).

В моем примере main создается Band с ограничением 3 альбомов, и в него пытаются добавить 4 альбомы, при этом первые 3 добавляются успешно, а четвертый не добавляется, но вместо этого печатая предупреждение о том, что он выходит за пределы.

Я также добавил метод printAlbums(), который будет использовать ваш mostraAlbum() для печати каждого Album в массиве albums.

Вывод:

Warning: Cannot add any more albums, limit reached.
The First (editado em 2001; tem 4 temas)
The Second (editado em 2055; tem 98 temas)
The Finale (editado em 2011; tem 12 temas)

РЕДАКТИРОВАНИЕ:

Я добавил конструктор Band(Album[] albums), это можно вызвать с помощью:

Album[] albums = new Album[3];
//Add your albums into this variable
Band b = new Band(albums);
0 голосов
/ 08 января 2020

Надеюсь, этот пример вам поможет.

    private Album[] albums; // array of album
    private int albumLimit; // limit for album

    public Band(int albumLimit) {
        this.albumLimit = albumLimit; // initialize limit
        this.albums = new Album[albumLimit]; // set limit of album array
    }

    // here it creates a new Album every time the loop runs
    // you can fill the array in other ways too
    public void fillAlbum() {
        for (int i = 0; i < albumLimit; i++) {
            String name = "name_" + i;
            int team = i;

            albums[i] = new Album(name, team);
        }
    }

    public void printAlbum() {
        for (int i = 0; i < albumLimit; i++) {
            System.out.println("Name :" + albums[i].getTitulo());
            System.out.println("Team :" + albums[i].getTemas());
            System.out.println();
        }
    }
}

0 голосов
/ 08 января 2020

Вам просто нужно добавить [], чтобы определить, что поле является массивом.

public class Band {
    private int totalAlbums;
    private Album[] albums;
    //...
}

private class Album {
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...