数组引用期望java

时间:2018-03-23 18:28:54

标签: java oop

嘿这是我需要写的功能: int addBookToLibrary(Book book) 如果有可用的地方,则将给定的书籍添加到此库中,并且该书籍尚未存在于库中。 参数: book - 要添加到此库的书。 返回: 如果有一个地点且书籍已成功添加,或者书籍已经在图书馆中,那么该书的非负ID号码;否则为负数。

和我的代码:( booksarray =书籍对象列表,bookcapacity - 数组的长度,bookcounter - 数组中当前的书籍数量)

{{shop.shopName}}

请帮我理解代码中的问题:)

4 个答案:

答案 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中实现(覆盖)trueequals()方法。在这些方法中,您可以指定使书籍相等的内容例如,如果书籍具有相同的名称,则书籍可以是相同的。 (例如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;
}

唯一的问题是我不知道这是否解决了你的问题,因为你并没有真正具体。如果您需要更多帮助,请告诉我