Как я могу получить доступ к закрытым членам класса, используя массив объектов в main()?

У меня есть один класс Movie с 4 частными членами. и я хочу получить доступ к этим закрытым членам в main(), используя массив объектов Movie Class. у меня есть 4 члена в киноклассе, соответственно название фильма, режиссер, киноактер, заработок в кино. я создал один параметризованный конструктор, который имеет 4 параметра и один метод to-String для отображения сведений об этом члене класса. теперь я хочу отсортировать доход от фильмов от самого высокого до самого низкого и отобразить названия фильмов в соответствии с этим доходом.

class Movie {
    private String movieName;
    private String movieDirector;
    private String movieActor;
    private double movieEarning;

    Movie(String movieName, String movieDirector, String movieActor, double movieEarning) {
        this.movieName = movieName;
        this.movieDirector = movieDirector;
        this.movieActor = movieActor;
        this.movieEarning = movieEarning;
    }

    public String toString() {
        return "\n" + "Movie Name = " + movieName + "\n" + "Movie Director =" + movieDirector + "\n" + "Movie Actor = " + movieActor + "\n" + "Movie Earning = " + movieEarning;
    }
    public void movieData() {
        //Print movie name where director = Rohit Shetty
        if (movieDirector.equals("Rohit Shetty") || movieDirector.equals("rohit shetty"))
            System.out.println("Movie Name=" + movieName);
        //Print director name who earned between 300 - 500
        if (movieEarning > 300 && movieEarning < 500)
            System.out.println("Print Director Names who earns more than 300 crores= " + movieDirector);
        //print moive details where actor = salman khan && director=kabir khan
        if (movieActor.equals("Salman Khan") && movieDirector.equals("kabir khan")) {
            System.out.println("Print Movie Names = " + movieName);
            System.out.println("Print Movie Earning = " + movieEarning);
        }
        //print movie name whose actor name starts with s
        if (movieActor.startsWith("s"))
            System.out.println("Print Actor Name where movie name starts with 's' = " + movieName);

        //print movie name with order of highest earning to lowest earning
    }


}

public class MovieDemo2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String movieName;
        String movieDirector;
        String movieActor;
        double movieEarning;
        Movie[] movieObj;
        movieObj = new Movie[6];
        for (int i = 1; i < movieObj.length; i++) {
            System.out.print("Enter " + i + " movie name :");
            movieName = sc.next();
            sc.nextLine();
            System.out.print("Enter " + i + " movie director name :");
            movieDirector = sc.next();
            sc.nextLine();
            System.out.print("Enter " + i + " movie actor: ");
            movieActor = sc.next();
            sc.nextLine();
            System.out.print("Enter " + i + " movie earning: ");
            movieEarning = sc.nextDouble();
            sc.nextLine();
            movieObj[i] = new Movie(movieName, movieDirector, movieActor, movieEarning);
            System.out.println(movieObj[i]);

        }
        for (int i = 1; i < movieObj.length; i++) {
            movieObj[i].movieData();
        }
    }

}

Я ожидаю результат, так как когда я ввожу доход от фильмов шесть раз, я буду отображать названия фильмов в порядке от самого высокого заработка до самого низкого заработка фильма. например, я ввожу значение как 400 500 200 800 100, тогда это дает мне список названий фильмов, которые зарабатывают от высокой до низкой.


person radhika thakkar    schedule 03.02.2019    source источник
comment
Вам необходимо реализовать Comparable или при использовании метода sort передать Comparator.   -  person SMA    schedule 03.02.2019
comment
я попробовал метод сортировки, но он работает только с одними данными, а не со всеми 6 членами класса, тогда что я могу сделать?   -  person radhika thakkar    schedule 03.02.2019
comment
Индексы массива отсчитываются от 0. Таким образом, циклы for должны начинаться как int i=0.   -  person Prasad Karunagoda    schedule 03.02.2019
comment
Примечание: лучше определять ваши переменные в то время, когда они нужны, а не в начале метода. Например, вы можете использовать String movieName = sc.next();.   -  person MC Emperor    schedule 03.02.2019
comment
@radhikathakkar, пожалуйста, отредактируйте вопрос и добавьте код, который вы пробовали для сортировки.   -  person Prasad Karunagoda    schedule 03.02.2019
comment
Вы можете использовать методы java.util.Arrays.sort() для достижения необходимой сортировки.   -  person Prasad Karunagoda    schedule 03.02.2019
comment
Еще одно замечание: все члены вашего класса Movie начинаются с movie. Поскольку они уже являются членами класса Movie, этот префикс немного избыточен. Например. movieName может быть просто name.   -  person MC Emperor    schedule 03.02.2019
comment
@prasadkarunagoda, когда я добавляю метод сортировки в класс фильмов, он ссылается только на последнюю переменную, потому что массив объектов находится в основном классе, а я не создал массив в классе фильмов, так что вы поделитесь со мной логикой сортировки для применения к этому коду?   -  person radhika thakkar    schedule 03.02.2019
comment
@MCEmperor хорошо, я сделаю это, спасибо   -  person radhika thakkar    schedule 03.02.2019


Ответы (1)


Здесь я пытаюсь продемонстрировать, как можно отсортировать массив. Я использовал Arrays.sort() для этого.

Обратите внимание, что класс Movie реализует интерфейс java.lang.Comparable. Итак, класс Movie должен реализовать метод compareTo() класса Comparable, который я сделал здесь.

import java.util.Arrays;

public class SortMovies
{
  public static void main(String[] args)
  {
    Movie[] movies = new Movie[6];
    movies[0] = new Movie("Movie 1", "Director 1", "Actor 1", 100.5);
    movies[1] = new Movie("Movie 2", "Director 2", "Actor 2", 300.5);
    movies[2] = new Movie("Movie 3", "Director 3", "Actor 3", 200.5);
    movies[3] = new Movie("Movie 4", "Director 4", "Actor 4", 700.5);
    movies[4] = new Movie("Movie 5", "Director 5", "Actor 5", 500.5);
    movies[5] = new Movie("Movie 6", "Director 6", "Actor 6", 400.5);

    // Assuming that you have built this movies array somehow

    // Sort
    Arrays.sort(movies);

    // Print sorted array
    for (Movie m : movies)
    {
      System.out.println(m);
    }
  }
}

class Movie implements Comparable<Movie>
{
  private String movieName;
  private String movieDirector;
  private String movieActor;
  private double movieEarning;

  Movie(String movieName, String movieDirector, String movieActor, double movieEarning)
  {
    this.movieName = movieName;
    this.movieDirector = movieDirector;
    this.movieActor = movieActor;
    this.movieEarning = movieEarning;
  }

  @Override
  public String toString()
  {
    return "\n" + "Movie Name = " + movieName + "\n" + "Movie Director =" + movieDirector + "\n" + "Movie Actor = " +
        movieActor + "\n" + "Movie Earning = " + movieEarning;
  }

  @Override
  public int compareTo(Movie otherMovie)
  {
    if (this.movieEarning > otherMovie.movieEarning)
    {
      return -1;
    }
    else if (this.movieEarning < otherMovie.movieEarning)
    {
      return 1;
    }
    else
    {
      return 0;
    }
  }
}
person Prasad Karunagoda    schedule 03.02.2019
comment
@PrasantKarunagoda, большое спасибо - person radhika thakkar; 03.02.2019
comment
@PrasantKarunagoda, но у меня есть один вопрос. Могу ли я сделать то же самое с классом сканера? потому что я хочу i/p от пользователей - person radhika thakkar; 03.02.2019
comment
@radhikathakkar, да, ты можешь это сделать. Я показал только часть сортировки. Вы можете создавать объекты Movie, используя входные данные из Scanner, как вы сделали в методе main() в вопросе. Как я упоминал в предыдущем комментарии, вам нужно начинать циклы с 0 (например, for(int =0 ...)). - person Prasad Karunagoda; 03.02.2019
comment
@radhikathakkar, добро пожаловать. Пожалуйста, примите ответ, если он решил вашу проблему :) - person Prasad Karunagoda; 03.02.2019
comment
@radhikathakkar использует sc.nextLine() вместо next(), чтобы прочитать полное имя. next() читает только первую строку. - person Arun Raaj; 03.02.2019