Сложность настройки и обновления объектов в Sorted ArrayList

Я хочу иметь возможность обновлять информацию об объектах, введенных пользователем. Я хотел бы, чтобы пользователь ввел имя книги и имя пользователя, чтобы вынуть книгу, а также иметь возможность вернуть ее с той же информацией. Объекты должны быть вставлены в нужное место в моих sortedarraylists. Предполагается, что каждый пользователь уникален, и каждую книгу может взять только один пользователь (который может взять до 3 книг).

Когда я пытаюсь скомпилировать свой код, я получаю это сообщение об ошибке:

java: method issueBook in class Driver cannot be applied to given types;
  required: Book,User
  found:    no arguments
  reason: actual and formal argument lists differ in length

Это соответствует issueBook(); в случае я моего меню.

У меня также есть классы User и Book, которые реализуют Comparable<Book> и т. д. Я пытался опустить как можно больше ненужного кода, например, средство чтения файлов для сканирования новых объектов пользователя и книги. Я включил книгу и пользовательские классы на случай, если их нужно будет посмотреть (я думаю, что в основном они в порядке). Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

import java.io.*;
import java.util.Scanner;

public class Driver {

    static Scanner sc = new Scanner(System.in);

    private static void mainMenu() {
        System.out.println("------------------------------\n"+
                "f: Finish running the program\n" +
                "b -Display on the screen the information about all the books in the library\n" +
                "u -Display on the screen the information about all the users.\n" +
                "i -Update the stored data when a book is issued to a user\n" +
                "r -Update the stored data when a user returns a book to the library\n" +
                "------------------------------\n" +
                "Type a letter and press Enter\n");
    }

 private static User readNames() throws User.InvalidBookLimitException {
        System.out.println("Enter the user's firstname: ");
        String firstName = sc.next();
        System.out.println("Enter the user's surname: ");
        String surName = sc.next();
        sc.nextLine();                                    //TODO check this
        return new User(firstName, surName, 0);
    }

    private static User readUserData(User user) throws User.InvalidBookLimitException {
        User u = readNames();
        System.out.println("Enter " + user + "'s age, and press Enter");
        int numberOfBooks = sc.nextInt();
        sc.nextLine();
        return new User(u.getFirstName(), u.getSurName(),u.getNumberOfBooks());
    }

    private static Book readBookName (){
        System.out.println("Type in the name of the book");
        String bookName = sc.nextLine();
        return new Book(bookName);
    }

/* public SortedArrayList<User> sortedUsers = new SortedArrayList<>();    public SortedArrayList<Book> sortedBooks = new SortedArrayList<>();*/ 
//If this part is commented out, I get errors since I can't seem to access the arraylists in the
// main method for the issueBook/returnBook methods.

    public void issueBook(Book book, User user){
        for (Book b : sortedBooks){
            if (b.equals(book)){
                b.loanStatus(true);
                /*b.setLoanerNames(user);*/ b.setLoanerNames("John", "Doe");
                break;
            }
        }
        for (User u: sortedUsers){
            if (u.equals(user)){
                u.setNumberOfBooks(u.getNumberOfBooks()+1);

            }
        }
    }

    public void returnBook(Book book, User user){
        for (Book b : sortedBooks){
            if (b.equals(book)){
                 b.loanStatus(false);
                 b.setLoanerNames(null, null);
                break;

            } for (User u: sortedUsers){
                if (u.equals(user)){
                    u.setNumberOfBooks(u.getNumberOfBooks()-1);
                }
            }
        }
    }

    public static <E> void main(String[] args) throws FileNotFoundException, User.InvalidBookLimitException {
        //These SortedArrayLists have been derived from the sorted arraylist class
        SortedArrayList<User> sortedUsers = new SortedArrayList<>();
        SortedArrayList<Book> sortedBooks = new SortedArrayList<>();

mainMenu(); //main menu printing method
        char ch = sc.next().charAt(0);
        sc.nextLine();
        while (ch !='f') //the program ends as desired if f is pressed


        { switch(ch){

            case 'b':
                System.out.println("Displaying information about all books in the library: ");
                /*for (Object item : sortedBooks) {
                    System.out.println(sortedBooks.toString());
                }*/
                System.out.println(sortedBooks/*.toString()*/);

                break;
            case 'u':
                System.out.println("Displaying information about all users");
                System.out.println(sortedUsers/*.toString()*/);
                break;

            case 'i':
                System.out.println("Enter the loaning out data. ");
                System.out.println("Enter the user's first name and surname: ");
                readNames();
                System.out.println("Enter the name of the book: ");
                readBookName();
                issueBook();
              
                or maybe  if (u1.compareTo(u2) == 0)*/

                break;
            case 'r':
                System.out.println("Please the details of the book to be returned: ");
                /*Book b = new Book("test1", "test2", true, "lol","lol2");*/
//this was just a test and didn't work 
                /*returnBook(b);*/

                break;

            default:
                System.out.println("Invalid input, please enter f, b, i or r");

        }
        mainMenu();
        ch = sc.next().charAt(0);
            sc.nextLine();
        }
    }
}

Мой отсортированный класс arraylist с (рабочим) методом вставки:

import java.util.ArrayList;

public class SortedArrayList<E extends Comparable<E>> extends ArrayList<E> {

    //no need for a generic in the insert method as this has been declared in the class
    public void insert(E value) {
        if (this.size() == 0) {
            this.add(value);
            return; }
        for (int i = 0; i < this.size(); i++) {
            int comparison = value.compareTo((E) this.get(i));
            if (comparison < 0) {
                this.add(i, value);
                return; }
            if (comparison == 0) {
                return; }
        }

        this.add(value);
    }

Класс пользователя:

import java.io.PrintWriter;

public class User implements Comparable<User> {
    private String firstName;
    private String surName;
    private int numberOfBooks;

    public User(){
        firstName = "";
        surName = "";
        numberOfBooks = 0;
    }

    public class InvalidBookLimitException extends Exception{
        public InvalidBookLimitException(){
            super("Invalid number of books");
        }

    }

    public User(String name1, String name2, int books) throws InvalidBookLimitException {

        this.firstName = name1;
        this.surName = name2;
        if (books>3) throw new InvalidBookLimitException ();
        this.numberOfBooks = books;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getSurName(){
        return surName;
    }

    public int getNumberOfBooks(){
        return numberOfBooks;
    }

    public boolean borrowMoreBooks(){
        return numberOfBooks < 3;
    }

    public void setNumberOfBooks(int numberOfBooks){
        this.numberOfBooks=numberOfBooks;
    }

    public void setUser(String name1, String name2, int books){
        firstName = name1;
        surName = name2;
        numberOfBooks = books;

    }


    public boolean userNameTest (User otherUser){
        return (firstName.equals(otherUser.firstName) && surName.equals(otherUser.surName));
    }


  /*  public boolean loanAnotherBook(){
        return !(numberOfBooks<3);
        numberOfBooks++;
    }*/
    public void printName(PrintWriter f){f.println(firstName+ " " + surName);}


/*
    public void setUser(User user) {
        if (loanStatus == false){
            loanStatus = Driver.readNameInput();
            loanStatus = true;
        }
    }*/
    @Override
    public String toString(){
        return "Name: " + firstName + " " + surName + " | Number of books: " + numberOfBooks;
    }



    public int compareTo(User u) {
       /* int snCmp = surName.compareTo(u.surName);
        if (snCmp != 0)
            return snCmp;
        else{
            int fnCmp = firstName.compareTo(u.firstName);
            if (fnCmp !=0)
                return fnCmp;
        }*/

        int fnCmp = firstName.compareTo(u.firstName);
        if (fnCmp != 0) return fnCmp;
        int snCmp= surName.compareTo(u.surName);
        if (snCmp !=0) return snCmp;
        else return numberOfBooks -u.numberOfBooks;



    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }
}

Книжный класс:

public class Book implements Comparable<Book>{
    public String bookName;
    public String authorName;
    public boolean loanStatus;
    public String loanerFirstName;
    public String loanerSurName;
    //if boolean loanStatus == true private string loaner name

    public Book(){
        bookName = "";
        authorName = "";
        loanStatus = false;
        loanerFirstName = null;
        loanerSurName = null;
    }

    Book(String book, String author, boolean loanStatus, String loanerFirstName, String loanerSurName) {

        this.bookName = book;
        this.authorName = author;
        this.loanStatus = loanStatus;
        this.loanerFirstName = loanerFirstName;
        this.loanerSurName = loanerSurName;
    }
    Book(String book){
        this.bookName=book;
    }



    public String getBookName(){
        return bookName;
    }
    public String getAuthorName(){
        return bookName;
    }
    public boolean getLoanStatus(){
        return loanStatus;
    }

    public String getLoanerFirstName(){
        return loanerFirstName;
    }
    public String getLoanerSurName(){
        return loanerSurName;
    }


    public void setBook(String book, String author, boolean loanStatus, String loanerFirstName, String loanerSurName){
        bookName = book;
        authorName = author;
        loanStatus = loanStatus;
        loanerFirstName = loanerFirstName;
        loanerSurName = loanerSurName;


    }

    public void setBookName(String bookName){
        this.bookName=bookName;
    }

    public void loanStatus(boolean loanStatus){
        this.loanStatus=loanStatus;
    }
    public void setLoanerNames(String loanerFirstName, String loanerSurName){
        this.loanerFirstName=loanerFirstName;
        this.loanerSurName=loanerSurName;
    }

 /*   public boolean nameTest (User otherUser){
        return (loanerFirstName.equals(otherUser.loanerFirstName)&& loanerSurName.equals(otherUser.loanerSurName));
    }
*/

    public String toString(){

        return "Book: " + bookName + " | Author: " + authorName + " | Loan status: " + loanStatus + " | Loaned to: " + loanerFirstName + " " + loanerSurName ;
    }


    //this may be redundant TODO
  /*  public void setLoanStatus(User user){
        loanStatus = false;

    }*/

    //This compare method allows new user objects to be compared to ones in the
 @Override       //sortedArrayList, enabling the insertion method.
    public int compareTo(Book b) {
        int bnCmp = bookName.compareTo(b.bookName);
        if (bnCmp != 0) return bnCmp;
        int anCmp= authorName.compareTo(b.authorName);
        if (anCmp !=0) return anCmp;
//        int lsCmp= loanStatus.(b.loanStatus);
//        if (lsCmp !=0) return lsCmp;
        int lrfnCmp =loanerFirstName.compareTo(b.loanerFirstName);
        if (lrfnCmp !=0) return lrfnCmp;
        int lrlnCmp =loanerSurName.compareTo(b.loanerSurName);
        if (lrlnCmp !=0) return lrlnCmp;
        else return 0;

    }
}

В операторе переключения класса Driver для случая i вы вызываете метод issueBook() без передачи какого-либо аргумента. Но issueBook ожидает Book и User в качестве аргументов в соответствии с его определением issueBook(Book book, User user). Пожалуйста, передайте соответствующие параметры. Надеюсь это поможет!

Sruthi 13.12.2020 17:00

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

Steven Schmidt 13.12.2020 17:07

Вы создали объект, но не передали его в метод issueBook.

Sruthi 13.12.2020 17:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
User user = readNames();
Book book = readBookName();
issueBook(book, user);

Вы должны передать пользователя и книгу, которые вы создали при вызове метода issueBook.

Привет спасибо. Я пробовал это, но получил 186:17 java: на нестатический метод issueBook(Book,User) нельзя ссылаться из статического контекста

Steven Schmidt 13.12.2020 17:18

Это может вам помочь: stackoverflow.com/questions/290884/…. Вы можете сделать свою issueBook статической, как и другие методы readNames() и readBookName()

Sruthi 13.12.2020 17:29

Привет спасибо. Я попытался сделать метод issueBook public void static, но затем я получаю эту ошибку, соответствующую массивам sortedBooks и sortedUsers: на нестатическое поле sortedBooks нельзя ссылаться из статического контекста. Кажется, это создает каскад проблем.

Steven Schmidt 13.12.2020 17:58

Либо вы можете сделать поля и методы статическими, чтобы иметь к ним прямой доступ, либо вы можете создать объект класса и получить доступ к объекту. Это может помочь вам понять концепции stackoverflow.com/questions/2559527/…

Sruthi 13.12.2020 21:11

Другие вопросы по теме