容器类java

时间:2015-11-30 23:40:56

标签: java containers

我遇到了问题,我不明白如何解决。

所以我有3个班级:第一个是主要的,第二个是书,第三个是包含一些书籍的书架。

预订课程

spark-rowsimilarity

主要课程

public class Book {
private String title;
private int year;
private String edition;

public Book(String title, int year, String edition) {
    this.title= title;
    this.year= year;
    this.edition = edition;
}

public Book(Book l)
{
    this.title = l.title;
    this.year = l.year;
    this.edition = l.edition;
}

货架类

public static void main(String[] args) {


    Book one = new Book("Title1", first, 2014, "Edition1");
    Book two = new Book("Title2", second, 2013, "Edition2");
    Book three= new Book("Title3", third, 2015, "Edition3");
    Book four = new Book("Title4", fourth, 2015, "Edition4");

    Book[] v = new Book[3];
    v[0] = one;
    v[1] = two;
    v[2] = three;


    Shelf shelf= new Shelf();

   try{

    shelf.append(four);
   }(catch myException e)
    {
       System.out.println(e.toString());
    }

如何在货架类中执行追加方法?显然它给了我NullPointerException,因为我使用的数组是null,但我不知道如何管理它。

还有一个问题,如何在Shelf类中插入Book对象?

首先在我写的构造函数中#34; this.v = v"所以当我声明一个架子对象时,我在主类中传递了它的v数组,它不是null,但是它运行了,但是练习说没有这样做。

P.S。我必须使用普通数组进行此练习,我的意思是没有arrayList,我仍然需要学习它。

3 个答案:

答案 0 :(得分:2)

每次插入新书时,您都在进行扩展和复制。这不是必需的。更好的是具有仅在阵列填充时扩展的初始容量。

private static final int INCREMENT = 100;
private int capacity = 0;
private int size = 0;
private Book[] books = {};

public void append(Book book) {
    assert book != null;
    expandIfFull();
    books[size++] = book;
}

private void expandIfFull() {
    assert size <= capacity; 
    if (capacity == size) {
        capacity += INCREMENT;
        Book[] copy = new Book[capacity];
        for (int i = 0; i < size; i++)
            copy[i] = books[i];
        books = copy;
    }
}

这具有性能优势,但在我看来,通过从附加代码中拆分扩展代码可以使您的意图更加清晰。使用单独的方法意味着它也可以在insert方法中调用。

您可以使用Arrays方法减少扩展代码,但我假设您不能使用Java集合意味着您需要手动执行此操作。

您还询问了如何插入;我已经添加了一个示例方法。要记住的关键是你需要先从插入位置开始移动书籍。否则你最终会通过数组的其余部分复制同一本书。

public void insert(int index, Book book) {
    assert index < size;
    expandIfFull();
    for (int i = size; i > index; i--)
        books[i] = books[i - 1];
    books[index] = book;
    size++;
}

答案 1 :(得分:1)

问题出在您的Shelf构造函数中。

public Shelf()
{
    v = new Book[3];
}

您正在将数组初始化为大小为3,但您永远不会在构造函数中填充书籍。所以一旦你new Shelf()它有一个大小为3的Book数组,其中包含3个空值。

因此,您获得了一个NPE,因为您的append(Book x)方法假定您的Book数组中没有空值。

public void append(Book x)
{
    Book[] vAppend = new Book[v.length + 1];

    for (int i = 0; i < v.length; i++)
    {
        // ERROR: v.length is 3 but 
        // v[0], v[1], and v[2] will be null initially!!
        vAppend[i] = new Book(v[i]);
    }
    vAppend[v.length] = new Book(x);
    v = vAppend;
}

要解决此问题: 最简单的方法是更改​​构造函数以生成大小为0的数组。然后其余代码将处理它。

public Shelf()
{
    v = new Book[0];
}

答案 2 :(得分:0)

您可以使用以下内容:

Class