Equals 方法对对象的副本表现得很奇怪
Equals method is acting weird with a copy of an object
我是 Java 的新手,想知道为什么我写的这个方法不起作用:
public boolean checkOut(Person p, Book b, String dueDate){
ArrayList<Book> removeBooks = new ArrayList<Book>();
if (libraryBooks.contains(b) && patrons.contains(p)){
for (Book book1 : libraryBooks){
if (book1.equals(b)){
p.addBook(book1);
removeBooks.add(book1);
book1.setDueDate(dueDate);
break;
}}
for (Book b2 : removeBooks){
libraryBooks.remove(b2);
}
return true;
}
else{
return false;
}
}
该方法接受一个人、一本书和到期日期。 libraryBooks 是图书馆 class 拥有的所有图书对象的列表。图书馆有赞助人,图书馆成员的名单。
此方法应该检查 Book 对象 b 和 Person b 是否分别在图书馆的图书和赞助人列表中。接下来,它遍历 libraryBooks 中的每个书籍对象,并使用重写的 equals 方法来比较对象是否相同。如果是,它会将这本书分配给 Persons 图书列表,并在它已借出且不再位于图书馆内时将其从 libraryBooks 中删除。
提交要评分的 class 文件后,我收到以下错误:
.一个人可以签出一本已经签出的书。
。借出一本书时,您应该更新图书馆中的书而不是传入的书。
我很困惑一个人如何能够签出已经签出的图书对象,因为此方法应该 1. 检查传递的图书对象是否在 libraryBooks 中,以及 2. 如果存在,则将其从 libraryBooks 中删除它被签出!
这里是 Book.java,其中包含书籍对象:
public class Book {
//Initializing variables
private String title;
private String author;
private String dueDate;
private boolean checkedOut;
private double bookId;
private double bookValue;
//Constructor
public Book(String t, String a, double id, double bv){
title = t;
author = a;
bookId = id;
bookValue = bv;
}
//Accessor
public String getTitle(){
return title;
}
//Accessor
public String getAuthor(){
return author;
}
//Accessor
public String getDueDate(){
return dueDate;
}
//Accessor
public boolean isCheckedOut(){
return checkedOut;
}
//Accessor
public double getBookId(){
return bookId;
}
//Accessor
public double getBookValue(){
return bookValue;
}
//Mutator
public void setDueDate(String dd){
dueDate = dd;
}
//Mutator
public void setBookValue(double bv){
bookValue = bv;
}
//Mutator
public void setCheckedOut(boolean b){
checkedOut = b;
}
@Override
public boolean equals(Object o){
//Testing to see if value isnt null
if(o == null){
return false;
}
//Testing to see if value is getting compared to itself
if (this == o){
return true;
}
//Checking if the values are of the same class
if (getClass() != o.getClass()){
return false;
}
Book book = (Book)o;
return (book.bookId == this.bookId);
}
这里是 Person.java:
public Person(String n, String a, int lcn){
name = n;
address = a;
libraryCardNum = lcn;
}
//Accessor
public String getName(){
return name;
}
//Accessor
public int getLibraryCardNumber(){
return libraryCardNum;
}
//Accessor
public ArrayList<Book> getCheckedOut(){
return checkedOut;
}
//Accessor
public String getAddress(){
return address;
}
//Accessor
public int getLibraryCardNum(){
return libraryCardNum;
}
//Mutator
public void setAddress(String a){
address = a;
}
//Mutator
public void setLibraryCardNum(int lcn){
libraryCardNum = lcn;
}
//Mutator Method
public void setName(String n){
name = n;
}
public boolean addBook(Book b){
//Checks to see if the book is already in the AL
if (checkedOut.contains(b)){
return false;
}
else{
checkedOut.add(b);
return true;
}
}
public boolean hasRead(Book b){
if (checkedOut.contains(b)){
return true;
}
else{
return false;
}
}
public boolean forgetBook(Book b){
if (checkedOut.contains(b)){
checkedOut.remove(b);
return true;
}
else{
return false;
}
}
public int numBooksRead(){
return checkedOut.size(); //Returns the amount of book objects in AL
}
@Override
public boolean equals(Object o){
//Checks to make sure the object isnt null
if (o == null){
return false;
}
//Checks to see if objects are of the same class
if (getClass() != o.getClass()){
return false;
}
//Casts the object to the person class
Person person = (Person)o;
//Checks to see if the name and ID are the same
return (this.libraryCardNum == person.libraryCardNum);
}
这是完整的 Library.java:
import java.util.ArrayList;
import java.util.GregorianCalendar;
import org.junit.Test;
public class Library {
private ArrayList<Book> libraryBooks = new ArrayList<Book>();
private ArrayList<Person> patrons = new ArrayList<Person>();
private String name;
private int numBooks;
private int numPeople;
private static String currentDate;
//Constructor
public Library(String n){
name = n;
}
//Accessor
public ArrayList<Book> getLibraryBooks(){
return libraryBooks;
}
//Accessor
public ArrayList<Person> getPatrons(){
return patrons;
}
//Accesor
public String getName(){
return name;
}
//Accesor
public int getNumBooks(){
int checkedOutBooks = totalNumBooks() - libraryBooks.size();
numBooks = libraryBooks.size() - checkedOutBooks;
return numBooks;
}
//Accesor
public int getNumPeople(){
numPeople = patrons.size();
return numPeople;
}
//Accesor
public String getCurrentDate(){
return currentDate;
}
//Mutator
public void setName(String n){
name = n;
}
//Mutator
public void setCurrentDate(String d){
currentDate = d;
}
//Mutator
public void setLibraryBooks(ArrayList<Book> b){
libraryBooks = b;
}
//Mutator
public void setPatrons(ArrayList<Person> p){
patrons = p;
}
@Test
public int checkNumCopies(String title, String author){
int numCopies = 0;
for (Book b1 : libraryBooks){
String t = b1.getTitle();
String a = b1.getAuthor();
if (t == title && a == author){
numCopies++;
}
}
for (Person p1 : patrons){
ArrayList<Book> books = p1.getCheckedOut();
for (Book b1: books){
String t = b1.getTitle();
String a = b1.getAuthor();
if (t == title && a == author){
numCopies++;
}
}
}
return numCopies;
}
public int totalNumBooks(){
int numCopies = 0;
for (@SuppressWarnings("unused") Book b1 : libraryBooks){
numCopies++;
}
for (Person p1 : patrons){
ArrayList<Book> books = p1.getCheckedOut();
for (Book b1: books){
numCopies++;
}
}
return numCopies;
}
public boolean checkOut(Person p, Book b, String dueDate){
ArrayList<Book> removeBooks = new ArrayList<Book>();
if (libraryBooks.contains(b) && patrons.contains(p) && b.isCheckedOut()== false){
for (Book book1 : libraryBooks){
if (book1.equals(b)){
p.addBook(book1);
removeBooks.add(book1);
book1.setDueDate(dueDate);
b.setCheckedOut(true);
System.out.println("Checked out!");
break;
}}
for (Book b2 : removeBooks){
libraryBooks.remove(b2);
}
return true;
}
else{
System.out.println("Not checked out!");
return false;
}
}
我认为这不会解决问题,但值得一试。
if (book1.equals(b)){
p.addBook(book1);
removeBooks.add(book1);
book1.setDueDate(dueDate);
b.setCheckedOut(true);
System.out.println("Checked out!");
break;
}
看看那一行
b.setCheckedOut(true);
将输入的图书状态由false变为true,但不会将图书在图书馆的状态由false变为true。
更正后的横线应为
book1.setCheckedOut(true);
如果该修复不起作用,您能否也添加您的测试用例?我无法重现您的问题,因为您的代码似乎对我来说工作得很好。
我是 Java 的新手,想知道为什么我写的这个方法不起作用:
public boolean checkOut(Person p, Book b, String dueDate){
ArrayList<Book> removeBooks = new ArrayList<Book>();
if (libraryBooks.contains(b) && patrons.contains(p)){
for (Book book1 : libraryBooks){
if (book1.equals(b)){
p.addBook(book1);
removeBooks.add(book1);
book1.setDueDate(dueDate);
break;
}}
for (Book b2 : removeBooks){
libraryBooks.remove(b2);
}
return true;
}
else{
return false;
}
}
该方法接受一个人、一本书和到期日期。 libraryBooks 是图书馆 class 拥有的所有图书对象的列表。图书馆有赞助人,图书馆成员的名单。
此方法应该检查 Book 对象 b 和 Person b 是否分别在图书馆的图书和赞助人列表中。接下来,它遍历 libraryBooks 中的每个书籍对象,并使用重写的 equals 方法来比较对象是否相同。如果是,它会将这本书分配给 Persons 图书列表,并在它已借出且不再位于图书馆内时将其从 libraryBooks 中删除。
提交要评分的 class 文件后,我收到以下错误: .一个人可以签出一本已经签出的书。
。借出一本书时,您应该更新图书馆中的书而不是传入的书。
我很困惑一个人如何能够签出已经签出的图书对象,因为此方法应该 1. 检查传递的图书对象是否在 libraryBooks 中,以及 2. 如果存在,则将其从 libraryBooks 中删除它被签出!
这里是 Book.java,其中包含书籍对象:
public class Book {
//Initializing variables
private String title;
private String author;
private String dueDate;
private boolean checkedOut;
private double bookId;
private double bookValue;
//Constructor
public Book(String t, String a, double id, double bv){
title = t;
author = a;
bookId = id;
bookValue = bv;
}
//Accessor
public String getTitle(){
return title;
}
//Accessor
public String getAuthor(){
return author;
}
//Accessor
public String getDueDate(){
return dueDate;
}
//Accessor
public boolean isCheckedOut(){
return checkedOut;
}
//Accessor
public double getBookId(){
return bookId;
}
//Accessor
public double getBookValue(){
return bookValue;
}
//Mutator
public void setDueDate(String dd){
dueDate = dd;
}
//Mutator
public void setBookValue(double bv){
bookValue = bv;
}
//Mutator
public void setCheckedOut(boolean b){
checkedOut = b;
}
@Override
public boolean equals(Object o){
//Testing to see if value isnt null
if(o == null){
return false;
}
//Testing to see if value is getting compared to itself
if (this == o){
return true;
}
//Checking if the values are of the same class
if (getClass() != o.getClass()){
return false;
}
Book book = (Book)o;
return (book.bookId == this.bookId);
}
这里是 Person.java:
public Person(String n, String a, int lcn){
name = n;
address = a;
libraryCardNum = lcn;
}
//Accessor
public String getName(){
return name;
}
//Accessor
public int getLibraryCardNumber(){
return libraryCardNum;
}
//Accessor
public ArrayList<Book> getCheckedOut(){
return checkedOut;
}
//Accessor
public String getAddress(){
return address;
}
//Accessor
public int getLibraryCardNum(){
return libraryCardNum;
}
//Mutator
public void setAddress(String a){
address = a;
}
//Mutator
public void setLibraryCardNum(int lcn){
libraryCardNum = lcn;
}
//Mutator Method
public void setName(String n){
name = n;
}
public boolean addBook(Book b){
//Checks to see if the book is already in the AL
if (checkedOut.contains(b)){
return false;
}
else{
checkedOut.add(b);
return true;
}
}
public boolean hasRead(Book b){
if (checkedOut.contains(b)){
return true;
}
else{
return false;
}
}
public boolean forgetBook(Book b){
if (checkedOut.contains(b)){
checkedOut.remove(b);
return true;
}
else{
return false;
}
}
public int numBooksRead(){
return checkedOut.size(); //Returns the amount of book objects in AL
}
@Override
public boolean equals(Object o){
//Checks to make sure the object isnt null
if (o == null){
return false;
}
//Checks to see if objects are of the same class
if (getClass() != o.getClass()){
return false;
}
//Casts the object to the person class
Person person = (Person)o;
//Checks to see if the name and ID are the same
return (this.libraryCardNum == person.libraryCardNum);
}
这是完整的 Library.java:
import java.util.ArrayList;
import java.util.GregorianCalendar;
import org.junit.Test;
public class Library {
private ArrayList<Book> libraryBooks = new ArrayList<Book>();
private ArrayList<Person> patrons = new ArrayList<Person>();
private String name;
private int numBooks;
private int numPeople;
private static String currentDate;
//Constructor
public Library(String n){
name = n;
}
//Accessor
public ArrayList<Book> getLibraryBooks(){
return libraryBooks;
}
//Accessor
public ArrayList<Person> getPatrons(){
return patrons;
}
//Accesor
public String getName(){
return name;
}
//Accesor
public int getNumBooks(){
int checkedOutBooks = totalNumBooks() - libraryBooks.size();
numBooks = libraryBooks.size() - checkedOutBooks;
return numBooks;
}
//Accesor
public int getNumPeople(){
numPeople = patrons.size();
return numPeople;
}
//Accesor
public String getCurrentDate(){
return currentDate;
}
//Mutator
public void setName(String n){
name = n;
}
//Mutator
public void setCurrentDate(String d){
currentDate = d;
}
//Mutator
public void setLibraryBooks(ArrayList<Book> b){
libraryBooks = b;
}
//Mutator
public void setPatrons(ArrayList<Person> p){
patrons = p;
}
@Test
public int checkNumCopies(String title, String author){
int numCopies = 0;
for (Book b1 : libraryBooks){
String t = b1.getTitle();
String a = b1.getAuthor();
if (t == title && a == author){
numCopies++;
}
}
for (Person p1 : patrons){
ArrayList<Book> books = p1.getCheckedOut();
for (Book b1: books){
String t = b1.getTitle();
String a = b1.getAuthor();
if (t == title && a == author){
numCopies++;
}
}
}
return numCopies;
}
public int totalNumBooks(){
int numCopies = 0;
for (@SuppressWarnings("unused") Book b1 : libraryBooks){
numCopies++;
}
for (Person p1 : patrons){
ArrayList<Book> books = p1.getCheckedOut();
for (Book b1: books){
numCopies++;
}
}
return numCopies;
}
public boolean checkOut(Person p, Book b, String dueDate){
ArrayList<Book> removeBooks = new ArrayList<Book>();
if (libraryBooks.contains(b) && patrons.contains(p) && b.isCheckedOut()== false){
for (Book book1 : libraryBooks){
if (book1.equals(b)){
p.addBook(book1);
removeBooks.add(book1);
book1.setDueDate(dueDate);
b.setCheckedOut(true);
System.out.println("Checked out!");
break;
}}
for (Book b2 : removeBooks){
libraryBooks.remove(b2);
}
return true;
}
else{
System.out.println("Not checked out!");
return false;
}
}
我认为这不会解决问题,但值得一试。
if (book1.equals(b)){
p.addBook(book1);
removeBooks.add(book1);
book1.setDueDate(dueDate);
b.setCheckedOut(true);
System.out.println("Checked out!");
break;
}
看看那一行
b.setCheckedOut(true);
将输入的图书状态由false变为true,但不会将图书在图书馆的状态由false变为true。
更正后的横线应为
book1.setCheckedOut(true);
如果该修复不起作用,您能否也添加您的测试用例?我无法重现您的问题,因为您的代码似乎对我来说工作得很好。