srmjr srmjr - 4 months ago 17
Java Question

Output problems when printing an array and toString

enter image description hereI have three problems.

1) I have an array of ebooks that I am trying to print. The array is 25 elements long and I have placed 6 ebooks in it. When I print, it prints each ebook 25 times, rather than just once.

2) I have output at the end of my program that is printing a large decimal number before my desired print statement

3) How do I implement JOptionPane, or some other class, to print ALL output onto one dialog box?

import javax.swing.JOptionPane; // dialog box

public class Ebook
{
private String author = "";
private String title = "";
private double price = 0.0;
private String isbn = "";


public Ebook(String author, String title, double price, String isbn) // ebook constructor
{
this.author = author;
this.title = title;

if (price > 0) // validate non-negative price
this.price = price;

else
{
this.price = 0.0;
System.out.println("Invalid price");
}

if (isbn.length() == 10 || isbn.length() == 13) // isbn length must be exactly 10 or 13
this.isbn = isbn;

else
this.isbn = "None";
}

public void setPrice(double price)
{
if (price < 0) // vallidate
{
System.out.println("Invalid price");
}

else
this.price = price;
}

public double getPrice()
{
return price;
}

public void setAuthor(String theAuthor)
{
this.author = theAuthor;
}

public String getAuthor()
{
return author;
}

public void setIsbn(String isbn)
{
if (isbn.length() == 10 || isbn.length() == 13) // validate
{
this.isbn = isbn;
}
else
isbn = "None";
}

public String getIsbn()
{
return isbn;
}

public void setTitle(String title)
{
this.title = title;
}

public String getTitle()
{
return title;
}

public String toString()
{
return String.format("Author: %s%nTitle: %s%nPrice: $%.1f%nISBN: %s%n",
author,title,price,isbn);
}
} // This was made by ------

import javax.swing.JOptionPane; // dialog box

public class EbookLibrary
{
private int count = 0;
private double total_cost = 0.0;


Ebook[] ebooks = new Ebook[25]; // array of ebook objects

public EbookLibrary() // no argument constructor for ebooklibrary object in library test
{

}
public int getCount() // total number of ebooks
{
return count;
}
public double getCost() // sum of all ebooks
{
return total_cost;
}
public String toString() // formatted string with the number and cost of all ebooks
{
return String.format("Ebook count: %d%nTotal Cost: $%.1f", count, total_cost);
}
public void addEbook(String author, String title, double price, String isbn) // adds ebooks to the array
{
Ebook anEbook = new Ebook(author,title,price,isbn); // not sure if this is a "constructor", but I think it is

for (int counter = 0; counter < ebooks.length; counter++) // for the length of the array, add ebook
{
ebooks[counter] = anEbook; // for each counter, add the ebook
total_cost += price;
count++; // used to find the total number of ebooks
System.out.printf("%s%n", ebooks[counter]);

}


}



} // This was made by -----

import javax.swing.JOptionPane; // dialog box

public class EbookLibraryTest
{
public static void main(String[] args)
{

EbookLibrary aLibrary = new EbookLibrary(); // EbookLibrary object for calling addEbook

//ebook objects, more can be added to test set, get methods
aLibrary.addEbook("Blah", "What", 88.8, "1234567891");
aLibrary.addEbook("Thing Do", "What What", 45.0, "1234567891111");
aLibrary.addEbook("Stephen King","The Thing",1.1, "1234567891");
aLibrary.addEbook("Robert","A Title", -1.0, "1234567891"); // test invalid price, should return 0.0 and "invalid price"
aLibrary.addEbook("Tom","Bad Title", 33.1, "1234567891111");
aLibrary.addEbook("Bob", "FML and Other Acronyms", 25.0, "1"); // test ISBN value, should return "None"




System.out.printf("%d%f%s%n", aLibrary.getCount(), // call methods, print with toString
aLibrary.getCost(), aLibrary.toString());

System.out.println("Programmed by -----");

}
}

Answer

I believe the problem is with your addEbook method in your EbookLibrary class. Every time you add a new Ebook, you fill the entire ebooks array with it. At each iteration, you're also incrementing the total_cost and the count. I'm assuming you only want to add it one time to the array and verify that the array is not full before doing so. Try this.

public void addEbook(String author, String title, double price, String isbn) // adds ebooks to the array
{
    if(count==ebooks.length-1) {
        return;
    }
    Ebook anEbook = new Ebook(author,title,price,isbn);

    ebooks[count] = anEbook;
    total_cost += price;
    System.out.printf("%s%n", anEbook);
    count++; // used to find the total number of ebooks
}