我遇到了问题,我不明白如何解决。
所以我有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,我仍然需要学习它。
答案 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