Добавление и извлечение элементов из массивов объектов в java

#java #arrays

#java #массивы

Вопрос:

Я создаю простую базу данных фильмов с двумя классами, а именно Movie и Library.Библиотечный класс имеет метод addMovie, который добавляет объекты movie в массив объектов Movie. Другой метод borrowMovie извлекает фильмы из массива объектов movie, а returnMovie возвращает объекты Movie обратно в массив.Это указывает на то, что фильм был возвращен, предполагается, что borrowMovie работает таким образом, что вы не сможете позаимствовать фильм дважды, если он не был возвращен таким образом, что если бы кто-то попытался его позаимствовать. это показало бы, что они уже заимствованы, и если их нет в массиве Movie, это должно указывать на то, что фильма нет в каталоге. Другой метод printAvailableMovies должен печатать все фильмы в библиотеке.Вот мой пример кода для классов movie и Library.

Movie.java

 public class Movie {

    public String title;
    boolean borrowed,returned;

    // Creates a new Movie
    public Movie(String movieTitle) {
        
       title = movieTitle;
    }
   
    
    // Marks the movie as rented
    public void borrowed() {
        
        borrowed = true;
    }
   
    // Marks the movie as not rented
    public void returned() {
        
           returned = true;
    }
   
    // Returns true if the movie is rented, false otherwise
    public boolean isBorrowed() {
        
        if(borrowed amp;amp; !returned)
          return true;
          else
          return false;
         
    }
   
    // Returns the title of the movie
    public String getTitle() {
       
        
      return title;
    }

    public static void main(String[] arguments) {
        // Small test of the Movie class
        Movie example = new Movie("Christmas in Kampala");
        System.out.println("Title (should be Christmas in Kampala): "   example.getTitle());
        System.out.println("Borrowed? (should be false): "   example.isBorrowed());
        example.borrowed();
        System.out.println("Borrowed? (should be true): "   example.isBorrowed());
        example.returned();
        System.out.println("Borrowed? (should be false): "   example.isBorrowed());
    }
} 
  

Library.java

 public class Library {
    
    String address;
    boolean borrowMovie,returnMovie;
    Movie[] libMovies =new Movie[5] ;
    
    public Library(String libraryAddress){
           address = libraryAddress;
    }
    
    public void addMovie(Movie... movies ){
       int i = 0;
       for( Movie item: movies){
       libMovies[i] = item;}
    }
    public void borrowMovie(String movieTitle){
        for(Movie item: libMovies){
        if(movieTitle.equals(item.title))
        borrowMovie = true;
         else
         System.out.println("Sorry, this movie is not in our catalog.");
         }
        if(borrowMovieamp;amp;!returnMovie)
        System.out.println("You have successfully borrowed "   movieTitle);
        else
        System.out.println("Sorry, this movie is already borrowed.");
        
    }*/
    public void returnMovie(String movieTitle){
           returnMovie = true;
           System.out.println("You successfully returned "   movieTitle);
           }
      
    public static void printOpeningHours(){
       System.out.println ("Libraries are open daily from 9am to 5pm.");
    }
    public void printAddress(){
          System.out.println( address);
    }
    public void printAvailableMovies(){
           
       for( int i =0;i < libMovies.length;i  ){
       System.out.println(libMovies[i].getTitle());}
      // if(item == null)
       //System.out.println("No movie in catalog.");

    }
    public static void main(String[] args) {
        // Create two libraries
        Library firstLibrary = new Library("Plot 11, Kafene Road");
        Library secondLibrary = new Library("Plot 28, Kayembe Road");

        // Add four movies to the first library
        firstLibrary.addMovie(new Movie("Yogera"));
        firstLibrary.addMovie(new Movie("The Last King of Scotland"));
        firstLibrary.addMovie(new Movie("The Hostel"));
        firstLibrary.addMovie(new Movie("Christmas in Kampala"));

        // Print opening hours and the addresses
        System.out.println("Library hours:");
        printOpeningHours();
        System.out.println();
        
        System.out.println("Library addresses:");
        firstLibrary.printAddress();
        secondLibrary.printAddress();
        System.out.println();

        
        // Try to borrow Christmas in Kampala from both libraries
        System.out.println("Borrowing Christmas in Kampala:");
        firstLibrary.borrowMovie("Christmas in Kampala");
        firstLibrary.borrowMovie("Christmas in Kampala");
        secondLibrary.borrowMovie("Christmas in Kampala");
        System.out.println();

        Print the titles of all available movies from both libraries
        System.out.println("Movies available in the first library:");
        firstLibrary.printAvailableMovies();
        System.out.println();
        System.out.println("Movies available in the second library:");
        secondLibrary.printAvailableMovies();
        System.out.println();

        // Return Christmas in Kampala to the first library
        System.out.println("Returning Christmas in Kampala:");
        firstLibrary.returnMovie("Christmas in Kampala");
        System.out.println();

        // Print the titles of available movies from the first library
        System.out.println("Movies available in the first library:");
        firstLibrary.printAvailableMovies();
        
    }
} 
  

Основной метод для Library.java должен выводить

Часы работы библиотеки:

Библиотеки открыты ежедневно с 9 утра до 17 вечера.

Адреса библиотеки:

Участок 11, Кафене-роуд

Заимствование Рождества в Кампале:

Вы успешно позаимствовали Christmas в Кампале

Извините, этот ролик уже позаимствован.

Извините, этого ролика нет в нашем каталоге.

Фильмы, доступные в первой библиотеке:

Йогера

Последний король Шотландии

Хостел

Фильмы, доступные во второй библиотеке:

В каталоге нет фильма

Возвращение Рождества в Кампале:

Вы успешно вернули Рождество в Кампале

Фильмы, доступные в первой библиотеке:

Йогера

Последний король Шотландии

Хостел

Рождество в Кампале.

Теперь ролик.Java работает отлично и не требует никаких изменений, но Library.java является основным источником проблем, потому что я могу заставить его работать только до печати адресов библиотеки. Методы borrowMovie, addMovie, returnMovie и printAvailableMovies являются виновниками, поскольку они связаны с манипулированием массивами объектов Movie. Основной метод не должен меняться, а выходные данные должны быть такими, как указано выше, при тестировании Library.java.Пожалуйста, измените код, если необходимо, для этих методов, потому что мои идеи, похоже, не работают. Будем признательны за любую помощь.

Комментарии:

1. о, такое длинное описание. : (

2. Похоже на вопрос домашнего задания — и к тому же плохо разработанный. Являются ли эти API обязательными? реализация ‘Movie’ содержит избыточный индикатор — зачем вам нужны и ‘заимствованный’, и ‘возвращенный’? Кроме того — с точки зрения дизайна, большинство методов ‘Movie’ должны иметь только уровень доступа ‘package’, и я могу продолжить, указав, сколько изменений здесь необходимо внести …

Ответ №1:

Я внес некоторые изменения — в основном я удалил ненужный код из Movie , изменил библиотеку, чтобы она основывалась на Map , поскольку у вас есть только одна копия каждого заголовка — это ускорит поиск. Я добавил некоторую «обработку ошибок», но я предполагаю, что вы можете удалить их и заменить исключения на System.err.println для этого фрагмента кода.

Movie.java:

 public class Movie
{
    public String title;
    boolean borrowed;

    // Creates a new Movie
    public Movie(String movieTitle)
    {
        title = movieTitle;
    }

    // Marks the movie as rented
    void borrow() throws Exception
    {
        if (this.borrowed)
        {
            throw new Exception("The movie <"   this.title   "> is already borrowed - cannot borrow it again");
        }
        else
        {
            this.borrowed = true;
        }
    }

    // Marks the movie as not rented
    void returnMovie() throws Exception
    {
        if (this.borrowed)
        {
            this.borrowed = false;
        }
        else
        {
            throw new Exception("The movie <"   this.title   "> has not been borrowed - it cannot be returned");
        }
    }

    // Returns true if the movie is rented, false otherwise
    public boolean isBorrowed()
    {
        return this.borrowed;
    }

    // Returns the title of the movie
    public String getTitle()
    {
        return title;
    }

    public static void main(String[] arguments) throws Exception
    {
        // Small test of the Movie class
        Movie example = new Movie("Christmas in Kampala");
        System.out.println("Title (should be Christmas in Kampala): "   example.getTitle());
        System.out.println("Borrowed? (should be false): "   example.isBorrowed());
        example.borrow();
        System.out.println("Borrowed? (should be true): "   example.isBorrowed());
        example.returnMovie();
        System.out.println("Borrowed? (should be false): "   example.isBorrowed());
    }
}
  

Library.java:

 import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class Library
{
    String address;
    Map<String, Movie> movieLibrary;

    public Library(String libraryAddress)
    {
        address = libraryAddress;
        this.movieLibrary = new HashMap<String, Movie>();
    }

    public void addMovie(Movie... movies)
    {
        for (Movie item : movies)
        {
            this.movieLibrary.put(item.getTitle(), item);
        }
    }

    public void borrowMovie(String movieTitle)
    {
        Movie movie = this.movieLibrary.get(movieTitle);

        if (movie == null) // Not in libray
        {
            System.out.println("Sorry, this movie is not in our catalog.");
        }
        else
        {
            if (movie.isBorrowed())
            {
                System.out.println("Sorry, this movie is already borrowed.");
            }
            else
            {
                try
                {
                    movie.borrow();
                    System.out.println("You have successfully borrowed "   movieTitle);
                }
                catch (Exception e)
                {
                    System.out.println("An internal error has occured while attempting to borrow "   movieTitle   ", error details: "   e.getMessage());
                }
            }
        }
    }

    public void returnMovie(String movieTitle)
    {
        Movie movie = this.movieLibrary.get(movieTitle);

        if (movie == null) // Not in libray
        {
            System.out.println("Sorry, this movie is not in our catalog.");
        }
        else
        {
            if (movie.isBorrowed())
            {
                try
                {
                    movie.returnMovie();
                    System.out.println("You successfully returned "   movieTitle);
                }
                catch (Exception e)
                {
                    System.out.println("An internal error has occured while attempting to return "   movieTitle   ", error details: "   e.getMessage());
                }
            }
            else
            {
                System.out.println("Sorry, this movie is has not been borrowed.");
            }
        }
    }

    public static void printOpeningHours()
    {
        System.out.println("Libraries are open daily from 9am to 5pm.");
    }

    public void printAddress()
    {
        System.out.println(address);
    }

    public void printAvailableMovies()
    {
        Collection<Movie> movies = this.movieLibrary.values();

        if (movies.size() > 0)
        {
            for (Movie movie : movies)
            {
                if (!movie.isBorrowed())
                {
                    System.out.println(movie.getTitle());
                }
            }
        }
        else
        {
            System.out.println("No movie in catalog.");
        }

    }

    public static void main(String[] args)
    {
        // Create two libraries
        Library firstLibrary = new Library("Plot 11, Kafene Road");
        Library secondLibrary = new Library("Plot 28, Kayembe Road");

        // Add four movies to the first library
        firstLibrary.addMovie(new Movie("Yogera"));
        firstLibrary.addMovie(new Movie("The Last King of Scotland"));
        firstLibrary.addMovie(new Movie("The Hostel"));
        firstLibrary.addMovie(new Movie("Christmas in Kampala"));

        // Print opening hours and the addresses
        System.out.println("Library hours:");
        printOpeningHours();
        System.out.println();

        System.out.println("Library addresses:");
        firstLibrary.printAddress();
        secondLibrary.printAddress();
        System.out.println();

        // Try to borrow Christmas in Kampala from both libraries
        System.out.println("Borrowing Christmas in Kampala:");
        firstLibrary.borrowMovie("Christmas in Kampala");
        firstLibrary.borrowMovie("Christmas in Kampala");
        secondLibrary.borrowMovie("Christmas in Kampala");
        System.out.println();

        // Print the titles of all available movies from both libraries
        System.out.println("Movies available in the first library:");
        firstLibrary.printAvailableMovies();
        System.out.println();
        System.out.println("Movies available in the second library:");
        secondLibrary.printAvailableMovies();
        System.out.println();

        // Return Christmas in Kampala to the first library
        System.out.println("Returning Christmas in Kampala:");
        firstLibrary.returnMovie("Christmas in Kampala");
        System.out.println();

        // Print the titles of available movies from the first library
        System.out.println("Movies available in the first library:");
        firstLibrary.printAvailableMovies();

    }
}
  

Если вас волнует порядок расположения фильмов — используйте ArrayList или LinkedList вместо HashMap (И измените movieLibray элемент с Map на List )

Ответ №2:

Если вам нужно что-то добавлять и удалять, лучше всего использовать List вместо массива. Это сделает вашу жизнь намного проще.

Пример базового списка:

 List<String> ls = new ArrayList<String>();
ls.add("one");
ls.add("Three");
ls.add("two");
ls.add("four");

for(String value : ls) {
  System.out.println("Value :" value);
}

ls.remove("two");

for(String value : ls) {
  System.out.println("Value :" value);
}
  

Проблемы, которые я увидел на первом проходе:

addMovie() никогда не увеличивается i , поэтому вы никогда не записываете ни во что, кроме первого индекса массива. Этот метод также крайне небезопасен, поскольку было бы намного проще передать список фильмов, который длиннее созданного вами массива. Это возвращает меня к моему первому пункту.

Вы используете переменную экземпляра, если метод был заимствован или возвращен, но вы можете позаимствовать только один фильм.

Комментарии:

1. @WasswaSamuel: Добавлен пример. Взгляните на интерфейс, он очень простой.

Ответ №3:

Попробуйте сейчас :

 public class Library {

    String address;
    boolean borrowMovie,returnMovie;
    Movie[] libMovies =new Movie[5] ;
    int count = 0;

    public Library(String libraryAddress){
           address = libraryAddress;
    }

    public void addMovie(Movie... movies ){
       for( Movie item: movies){
       libMovies[count  ] = item;}
    }

    public void borrowMovie(String movieTitle) {
        for (Movie item : libMovies) {
            if (movieTitle.equals(item.title)) {
                borrowMovie = true;
                break;
            }

        }

        if(!borrowMovie) {
            System.out.println("Sorry, this movie is not in our catalog.");
            return;
        }


        if (borrowMovie amp;amp; !returnMovie)
            System.out.println("You have successfully borrowed "   movieTitle);
        else
            System.out.println("Sorry, this movie is already borrowed.");

    }
    public void returnMovie(String movieTitle){
           returnMovie = true;
           System.out.println("You successfully returned "   movieTitle);
           }

    public static void printOpeningHours(){
       System.out.println ("Libraries are open daily from 9am to 5pm.");
    }
    public void printAddress(){
          System.out.println( address);
    }
    public void printAvailableMovies(){

       for( int i =0;i < libMovies.length;i  ){
           if(libMovies[i] != null)
               System.out.println(libMovies[i].getTitle());}
      // if(item == null)
       //System.out.println("No movie in catalog.");

    }
    public static void main(String[] args) {
        // Create two libraries
        Library firstLibrary = new Library("Plot 11, Kafene Road");
        Library secondLibrary = new Library("Plot 28, Kayembe Road");

        // Add four movies to the first library
        firstLibrary.addMovie(new Movie("Yogera"));
        firstLibrary.addMovie(new Movie("The Last King of Scotland"));
        firstLibrary.addMovie(new Movie("The Hostel"));
        firstLibrary.addMovie(new Movie("Christmas in Kampala"));

        // Print opening hours and the addresses
        System.out.println("Library hours:");
        printOpeningHours();
        System.out.println();

        System.out.println("Library addresses:");
        firstLibrary.printAddress();
        secondLibrary.printAddress();
        System.out.println();


        // Try to borrow Christmas in Kampala from both libraries
        System.out.println("Borrowing Christmas in Kampala:");
        firstLibrary.borrowMovie("Christmas in Kampala");
        firstLibrary.borrowMovie("Christmas in Kampala");
//        secondLibrary.borrowMovie("Christmas in Kampala");
        System.out.println();

//        Print the titles of all available movies from both libraries
        System.out.println("Movies available in the first library:");
        firstLibrary.printAvailableMovies();
        System.out.println();
        System.out.println("Movies available in the second library:");
        secondLibrary.printAvailableMovies();
        System.out.println();

        // Return Christmas in Kampala to the first library
        System.out.println("Returning Christmas in Kampala:");
        firstLibrary.returnMovie("Christmas in Kampala");
        System.out.println();

        // Print the titles of available movies from the first library
        System.out.println("Movies available in the first library:");
        firstLibrary.printAvailableMovies();

    }
}