嘿这是我需要写的功能: int addBookToLibrary(Book book) 如果有可用的地方,则将给定的书籍添加到此库中,并且该书籍尚未存在于库中。 参数: book - 要添加到此库的书。 返回: 如果有一个地点且书籍已成功添加,或者书籍已经在图书馆中,那么该书的非负ID号码;否则为负数。
和我的代码:( booksarray =书籍对象列表,bookcapacity - 数组的长度,bookcounter - 数组中当前的书籍数量)
{{shop.shopName}}
请帮我理解代码中的问题:)
答案 0 :(得分:1)
我会给你一些提示。
首先,我会使用Set
而不是使用数组。
然后,在这里:
if (booksArray[i] == book){
这可能不起作用,具体取决于您如何实现它。在那里,您将booksArray[i]
中的引用与book
的引用进行比较。你怎么知道一本书何时与另一本书相等?例如,它是由内部的name
字段组成的,那么当两个具有相同名称的书籍实例被视为相同时?
所以,除非你需要数组,否则我建议你使用Set
,在类Book中实现equals和hash方法,并与contains()进行比较。
修改强>
如果根据您的评论不允许您使用Set
,请先了解您的问题。
如果你这样做
book book = new Book();
您已创建参考。然后,如果将这个非常相同的对象放在数组中,则会在数组中获得相同的引用,因此当您将它们与==
进行比较时,它们将指向相同的对象引用,结果将为{{1} }。
但是,如果您从其他地方获取书籍,或者复制数组内的对象(这将创建一个新的Book对象,因此使用不同的引用),那么两个引用将始终不同。
在这种情况下,您不希望通过引用来比较对象,而是通过其他方式来比较对象。在这种情况下,(1)您需要在Book中实现(覆盖)true
和equals()
方法。在这些方法中,您可以指定使书籍相等的内容例如,如果书籍具有相同的名称,则书籍可以是相同的。 (例如book1.name等于book2.name)。或者如果他们有相同的名字和同一作者......这取决于你的对象,这是你的决定。最后(2)您将图书与HashCode()
进行比较,而不是equals()
。这里有example。
顺便说一句,这是一个旁注...为了改进你的代码,我建议你这样做:
==
然后分别实施方法int addBookToLibrary(Book book) throws CapacityReachedException {
if( isLibraryMaxCapacity() ) {
throw new CapacityReachedException("The library is full");
}
if (!contains(book)) {
addBook(book);
}
return numberOfBooks();
}
,isLibraryMaxCapacity()
,contains(book)
和addBook(book)
。它们都很简单。
答案 1 :(得分:1)
这看起来很像家庭作业,但我看到你试图解决它所以我会给你帮助,其他答案建议使用Set应该在这样的情况下使用但考虑到你可能是初学者但仍然没有&#39 ;看看Java Collections我将尝试解释代码中的一些缺陷。
第一个问题是使用==
来检查相等性,而这对于基本类型很有用,当比较引用类型时这不够,另外还要正确比较2个对象,你需要覆盖equals方法在你的Book
课程中。
这就是它应该是什么样子,你没有提供你的书类,但为了简单起见这个比较的书名和作者看看书是否相同,你可以根据自己的需要进行调整。
public class Book {
private String title;
private String author;
@Override
public boolean equals(Object o) {
// Reference equality check(same reference => same object)
if (this == o)
return true;
// return false if it is null or current object
// doesn't have same class as one we are comparing with(they can't be same then)
if (o == null || getClass() != o.getClass())
return false;
// Otherwise we know that object belongs to same class so we can cast
Book book = (Book) o;
// Compare titles, if they are different we return false
if(!this.title.equals(book.title))
return false;
// Compare authors, if they are different we return false
if(!this.author.equals(book.author))
return false;
// Couldn't find difference so return true
return true;
}
}
可以做的另一件事就是删除found
标志,只要你看到那本书已经存在就返回,所以你的方法应该是这样的:
int addBookToLibrary(Book book) {
for (int i = 0; i <= bookCapacity; i++) {
// Note that we are using equals here
if (booksArray[i].equals(book)){
return -1; // Return -1 so you can check on calling place if book was added or not
}
}
if (bookCapacity> bookCounter) {
booksArray[bookCounter] = book;
bookCounter++;
}
return bookCounter;
}
最后一个问题,可能是有意的,但你应该考虑一下,就是你在增加它后返回bookCounter
,这意味着你在数组内的索引0返回1,你可以修复这通过添加另一个局部变量来保持前一个。
int currentIndex = bookCounter;
if (bookCapacity> bookCounter) {
booksArray[currentIndex] = book;
bookCounter++;
}
return currentIndex;
答案 2 :(得分:0)
更改代码中的以下语句
if (booksArray[i]==book)
到
if (booksArray[i].equals(book)
答案 3 :(得分:0)
所以这就是我要做的事情:
int addBookToLibrary(Book book){
boolean found = Arrays.asList(booksArray).contains(book);
if(bookCapacity > bookCounter && !found){
booksArray[bookCounter] = book;
bookCounter++;
}
return bookcounter;
}
唯一的问题是我不知道这是否解决了你的问题,因为你并没有真正具体。如果您需要更多帮助,请告诉我