how to sort array by object string member value?
I am trying to sort the 'stock' array (which is made up of Product objects) by the item name of each Product object. Before I start hacking at my code (which works well right now), I want to know if anyone can explain how I can sort this array by the String itemname of each Product object before output. Any help is much appreciated.
Code Java:
// Product.java
// Product class for Inventory Program
// Adam Gleason IT/215 2012
package inventory; //Declare package inventory
public class Product { //Declare class Product
public int itemnumber; //Declare integer itemnumber
public String itemname; //Declare string itemname
public int units; //Declare integer units
public double price; //Declare double price
public Product ( int newitemnumber, String newitemname, int newunits, double newprice) //constructor for class Product
{
itemnumber = newitemnumber; //Initialize integer newitemnumber
itemname = newitemname; //Initialize string newitemname
units = newunits; //Initialize integer newunits
price = newprice; //Initialize integer newprice
}
public int getItemNumber() //Declare method getItemNumber
{
return itemnumber; //Return itemnumber
}
public String getItemName() //Declare method getItemName
{
return itemname; //Return itemname
}
public int getUnits() //Declare method getUnits
{
return units; //Return units
}
public double getPrice() //Declare method getPrice
{
return price; //Return price
}
public double calculateValue() //Declare method calculateValue
{
return units * price; //return value calculation
}
} //End class Product
// Inventory.java
// Exercise with input exception handling
// Adam Gleason IT/215 2012
package inventory; //Declare package inventory
import java.util.InputMismatchException; //Import definition for InputMismatchException
import java.util.Scanner; //Import definition for Scanner
import java.util.Arrays;
public class Inventory { //Declare class Inventory
public static void main(String[] args) { //Declare method main
String stop; //Declare sentinal string stop
int result; //declare sentinal int result
Scanner input = new Scanner (System.in); //Declare new scanner object
int itemnumber; //Delcare int itemnumber
String itemname; //Delcare string itemname
int units; //Delcare integer units
double price; //Declare double price
Product[] stock; //new
stock = new Product[100];
int counter = 0; //new
stop = "stop"; //Initialize sentinal string stop
result = 1; //Initialize sentinal integer result
System.out.print("Welcome to the Inventory Program"); //Welcome message
while (result != 0) //Repetition statement for multiple product input
{
System.out.print( "\n\nEnter the item name (enter 'stop' to quit):" ); //Prompt for string itemname
itemname = input.nextLine(); //Input string itemname
result = itemname.compareTo(stop); //Compare sentinal string
if (result !=0) //Test sential integer
{
boolean itemnumberloop = true; //Initialize intemnumberloop repetion statement
itemnumber = 0; //Initialize integer itemnumber
while (itemnumberloop) //Begin intemnumberloop repetition statement
{
try //Try statement for valid input
{
int test = 0; //Initialize test variable
System.out.print("Enter the Item Number: "); //Prompt for integer itemnumber
itemnumber = input.nextInt(); //Input integer itemnumber
test = itemnumber / 1; //Test for valid input type
while (itemnumber < 0) //test for valid integer input
{
System.out.println("That is an invalid item number, please try again"); //Display invalid integer input message
System.out.print("Enter the Item Number: "); //Prompt for integer itemnumber
itemnumber = input.nextInt(); //Input integer itemnumber
}
itemnumberloop = false; //End itemnumberloop repetition statement after valid input
test = 0; //nullify value of test statement
}
catch (InputMismatchException inputMismatchException) //Exception statement for invalid input type
{
System.err.printf("\nError: %s\n", inputMismatchException); //Display error message
input.nextLine(); //nullify invalid input
System.out.println("You must input an integer, please try again\n"); //Display invalid input type message
}
}
boolean unitsloop = true; //Initialize unitsloop repetition statement
units = 0; //initialize integer units
while (unitsloop) //Begin unitsloop repetition statement
{
try //Try statement for valid input
{
int test = 0; //Initialize test variable
System.out.print("Enter the number of units: "); //Prompt for integer units
units = input.nextInt(); //Input integer units
test = units / 1; //Test for valid input type
while (units < 0) //Repition statement for valid integer input
{
System.out.println("That is an invalid number of units, please try again"); //Display invalid integer input message
System.out.print("Enter the number of units: ");//Prompt for integer units
units = input.nextInt(); //Input integer units
}
unitsloop = false; //End unitsloop repetition statement after valid input
test = 0; //nullify test variable
}
catch (InputMismatchException inputMismatchException) //Exception statement for invalid input type
{
System.err.printf("\nError: %s\n", inputMismatchException); //Display error message
input.nextLine(); //nullify invalid input
System.out.println("You must input an integer, please try again\n"); //Display invalid input message
}
}
boolean priceloop = true; //Initialize pricelooop repetition statement
price = 0; //Initialize double price
while (priceloop) //Begin priceloop repettion statement
{
try //Try statement for valid input
{
double test = 0; //Initialize test variable
System.out.print("Enter the price for each unit: ");//Prompt for double price
price = input.nextDouble(); //Input double price
test = price / 1; //Test for valid input type
while (price < 0) //Repetition statement for valid double input
{
System.out.println("That is an invalid price, please try again"); //Display invalid double input message
System.out.print("Enter the price for each unit: "); //Prompt for double price
price = input.nextDouble(); //Input double price
}
priceloop = false; //End priceloop repetition statement after valid input
test = 0; //nullify test variable
}
catch (InputMismatchException inputMismatchException) //Exception statement for invalid input type
{
System.err.printf("\nError: %s\n", inputMismatchException); //Display error message
input.nextLine(); //nullify invalid input
System.out.println("You must input a number, please try again\n"); //Display invalid input type message
}
}
stock[ counter ] = new Product (itemnumber, itemname, units, price);
counter++; //new
//Display output using Product class methods
itemname = input.nextLine(); //nullify string itemname for sentinal comparison
}
else
{
for (int count = 0; count < counter; count++)
System.out.printf("\n\nItem Number: %d\nItem Name: %s\nUnits in stock: %d\nPrice per unit: $%.2f\nTotal value of inventory: $%.2f", stock[count].getItemNumber(), stock[count].getItemName(), stock[count].getUnits(), stock[count].getPrice(), stock[count].calculateValue());
double total = 0;
for (int i = 0; i < counter; i++)
total += stock[i].calculateValue();
System.out.printf("\n\nTotal value of all inventory items: $%.2f", total);
System.out.println("\n\nThank you for using the Inventory Program"); //Display exit message after sentinal input
}
} //End repetition statement for multiple product input
} //End method main
} //End class Inventory
Re: how to sort array by object string member value?
Write a sort method that Compares the itemName members when making the decision on how to order the elements in the array.
Re: how to sort array by object string member value?
Ok, so I added this for loop at the beginning of the final else statement to display the output. It should compare the strings from each entry in the array. However, I am getting an error message that says Exception in thread "main" java.lang.NullPointerException whenever it gets to this line:
if(stock[b].getItemName().compareToIgnoreCase(stock[a].getItemName()) < 0)
Code Java:
else
{
for(int a = 0; a < stock.length; a++)
{
for(int b = a + 1; b < stock.length; b++)
{
if(stock[b].getItemName().compareToIgnoreCase(stock[a].getItemName()) < 0)
{
Product[] temp = { stock[a] };
stock[a] = stock[b];
stock[b] = temp[0];
}
}
}
for (int count = 0; count < counter; count++)
System.out.printf("\n\nItem Number: %d\nItem Name: %s\nUnits in stock: %d\nPrice per unit: $%.2f\nTotal value of inventory: $%.2f", stock[count].getItemNumber(), stock[count].getItemName(), stock[count].getUnits(), stock[count].getPrice(), stock[count].calculateValue());
double total = 0;
for (int i = 0; i < counter; i++)
total += stock[i].calculateValue();
System.out.printf("\n\nTotal value of all inventory items: $%.2f", total);
System.out.println("\n\nThank you for using the Inventory Program"); //Display exit message after sentinal input
}
} //End repetition statement for multiple product input
} //End method main
public static void SortByName( Product[] array )
{
for(int a = 0; a < array.length; a++)
{
for(int b = a + 1; b < array.length; b++)
{
if(array[b].getItemName().compareToIgnoreCase(array[a].getItemName()) < 0)
{
Product[] temp = { array[a] };
array[a] = array[b];
array[b] = temp[0];
}
}
}
}
} //End class Inventory
Re: how to sort array by object string member value?
Which variable in that statement has a null value?
Print out the values of all the variables in that line to see which variable has a null value. Then try to find out why it does not have a valid value.
You don't need to use any array when you save an element. Use a variable:
Product temp = stock[a] ;
and
array[b] = temp;
Re: how to sort array by object string member value?
ok, I changed it up a bit trying to get this right. I am still getting the null value error message though. Please help me understand how I should go about printing those values in the correct spot to identify which one returns a null value.
Code Java:
String compare;
Product temp = new Product ( 1, "a", 1, 1);
for(int a = 0; a < stock.length; a++)
{
for(int b = a + 1; b < stock.length; b++)
{
compare = stock[a].itemname;
if(stock[b].itemname.compareToIgnoreCase(compare) < 0)
{
temp = stock[a];
stock[a] = stock[b];
stock[b] = temp;
}
}
}
Re: how to sort array by object string member value?
Quote:
ill getting the null value error message
You need to find the variable with the null value.
Add a println just in front of the line where the NPE occurs. Print the values of all the variables.
Re: how to sort array by object string member value?
I have printed the values stored in stock[a], stock[b], temp, and compare just to make sure that everything was returning a value, not only did they all return a value, but the correct value as well. The null pointer exception error keeps pointing to this line
if(stock[b].getItemName().compareToIgnoreCase(compare) < 0)
*also has been written as if(stock[b].itemname.compareToIgnoreCase(compare) < 0)
I printed the values before and after this line and everything is returning the correct string value. Yet the null pointer exception error points to this line. Could it have something to do with the comparison to 0? I am really hitting a wall on this one. Please help.
Re: how to sort array by object string member value?
Did you print this: stock[b].getItemName()
it returns a reference that is used to access the compare...To() method
Re: how to sort array by object string member value?
yes, i printed...
stock[a].getItemName()
stock[a].itemname
stock[b].getItemName()
stock[b.itemname
temp.getItemName()
temp.itemname
compare
Re: how to sort array by object string member value?
I have figured it out....
apparently, the problem was with the looping statement that used variable b and what stock[b] was pointing to. I changed the statement to say this...
for(int b = a + 1; b < counter; b++)
using the counter that i used to when adding items to the stock array rather than using stock.length ( could probably have used stock.length-1 as well).
Thank you for all of your help, it has helped tremendously. The program works beautifully now.