clo1
asked on
Help on logic
I have a string which have the product code|quantity|@price
and separate by a "#" for each set. Example:
A123|20|2.99#B444|9|1.20#. ........an d so on.
but now, the user will add several set of string to this existing string, and the product code will be duplicate, so I would like to add the quantity for the same product code. For example the user input the:
N934|18|6.00#V245|6|0.00#A 123|10|2.9 9#......
so the final output string will be:
A123|30|2.99##B444|9|1.20# N934|18|6. 00#V245|6| 0.00
Please help with sample code for how to do it. Thanks !!
and separate by a "#" for each set. Example:
A123|20|2.99#B444|9|1.20#.
but now, the user will add several set of string to this existing string, and the product code will be duplicate, so I would like to add the quantity for the same product code. For example the user input the:
N934|18|6.00#V245|6|0.00#A
so the final output string will be:
A123|30|2.99##B444|9|1.20#
Please help with sample code for how to do it. Thanks !!
What you want is a class like this:
class Product
{
public String id ;
public int amount ;
public double price ;
public Product( String prodString )
{
StringTokenizer st = new StringTokenizer( "|" ) ;
int pos = 1 ;
while( st.hasMoreTokens() )
{
String element = st.nextToken() ;
switch( pos )
{
case 1 :
id = element ;
break ;
case 2 :
amount = Integer.parseInt( element ) ;
break ;
case 3 :
price = Double.parseDouble( element ) ;
break ;
}
pos++ ;
}
}
public boolean isEqual( Object o )
{
if( o instanceof Product )
{
return ((Product)o).id.equals( this.id ) ;
}
return false ;
}
public String toString()
{
return id + "|" + amount + "|" + price ;
}
public addAmount( Product p )
{
this.amount += p.amount ;
}
}
Create a Vector (call it v).
then use a String tokenizer (like above) to split the string at the "#" characters, and create a product by calling the constructor with this string (call it p)...
then, if v.indexOf( p ) finds the product with that id already exists in the vector (returns a position grater than -1 -- call that pos )
do:
((Product)v.elementAt( pos )).addAmount( p ) ;
Then at the end, step through all of the elements in your vector, and output them with a hash between them...
String str = "" ;
for( int i = 0 ; i < v.size() ; i++ )
{
str += ((Product)v.elementAt( i )).toString() ;
if( i < v.size() - 1 ) str += "#" ;
}
Good luck...
Tim.
class Product
{
public String id ;
public int amount ;
public double price ;
public Product( String prodString )
{
StringTokenizer st = new StringTokenizer( "|" ) ;
int pos = 1 ;
while( st.hasMoreTokens() )
{
String element = st.nextToken() ;
switch( pos )
{
case 1 :
id = element ;
break ;
case 2 :
amount = Integer.parseInt( element ) ;
break ;
case 3 :
price = Double.parseDouble( element ) ;
break ;
}
pos++ ;
}
}
public boolean isEqual( Object o )
{
if( o instanceof Product )
{
return ((Product)o).id.equals( this.id ) ;
}
return false ;
}
public String toString()
{
return id + "|" + amount + "|" + price ;
}
public addAmount( Product p )
{
this.amount += p.amount ;
}
}
Create a Vector (call it v).
then use a String tokenizer (like above) to split the string at the "#" characters, and create a product by calling the constructor with this string (call it p)...
then, if v.indexOf( p ) finds the product with that id already exists in the vector (returns a position grater than -1 -- call that pos )
do:
((Product)v.elementAt( pos )).addAmount( p ) ;
Then at the end, step through all of the elements in your vector, and output them with a hash between them...
String str = "" ;
for( int i = 0 ; i < v.size() ; i++ )
{
str += ((Product)v.elementAt( i )).toString() ;
if( i < v.size() - 1 ) str += "#" ;
}
Good luck...
Tim.
Ah, I see a load of people have answered, but here goes.
This should demo the idea of having a system that should be flexible enough to allow you to change product prices easily, build a nice GUI on it, whatever you want.
Use Tim's post to see how to parse the strings to extract the info if needed.
Good luck
Dan
just paste the below into a file called "Test.java" and run it to see if it is the sort of thing you are looking for.
-------------------
import java.util.*;
public class Test {
public static void main(String[] args) {
Orders o = new Orders();
Products p = new Products();
p.add( new Product("A0123", 2.2f) );
p.add( new Product("B0123", 1.2f) );
p.add( new Product("C0123", 0.2f) );
//retrieve the product for a given string:
Product prod;
prod = p.find("A0123");
o.addOrder(prod, 3);
prod = p.find("B0123");
o.addOrder(prod, 1);
prod = p.find("A0123");
o.addOrder(prod, 2);
prod = p.find("XXXX");
if (prod == null) {
System.out.println("Invali d product entered");
}else {
o.addOrder(prod, 3);
}
//Print the orders as one long string
System.out.println(o);
//change the price of one of the products:
prod = p.find("B0123");
prod.price = 5.5f;
//add another order:
prod = p.find("B0123");
o.addOrder( prod, 10 );
//Print the orders as one long string
System.out.println(o);
}
}
class Product {
public String code;
public float price;
Product(String code, float price) {
this.code = code;
this.price = price;
}
}
class Products {
Hashtable allProducts = new Hashtable();
public void add( Product p ) {
allProducts.put(p.code, p );
}
public Product find( String code ) {
Product p = (Product)allProducts.get( code );
return p;
}
}
class Orders {
Hashtable allOrders = new Hashtable();
public void addOrder(Product prod, int quantity) {
int num = 0;
Integer numInt = (Integer)allOrders.get(pro d);
if (numInt != null) {
num = numInt.intValue();
}
num += quantity;
allOrders.put(prod, new Integer(num));
}
public int getOrder(Product prod) {
int num = 0;
Integer numInt = (Integer)allOrders.get(pro d);
if (numInt != null) {
num = numInt.intValue();
}
return num;
}
public String toString() {
int max = allOrders.size() - 1;
StringBuffer buf = new StringBuffer();
Iterator it = allOrders.entrySet().itera tor();
while (it.hasNext()) {
Map.Entry e = (Map.Entry) (it.next());
Product prod = (Product)e.getKey();
buf.append(prod.code +"|"+ e.getValue() +"|"+ prod.price +"#");
}
return buf.toString();
}
}
This should demo the idea of having a system that should be flexible enough to allow you to change product prices easily, build a nice GUI on it, whatever you want.
Use Tim's post to see how to parse the strings to extract the info if needed.
Good luck
Dan
just paste the below into a file called "Test.java" and run it to see if it is the sort of thing you are looking for.
-------------------
import java.util.*;
public class Test {
public static void main(String[] args) {
Orders o = new Orders();
Products p = new Products();
p.add( new Product("A0123", 2.2f) );
p.add( new Product("B0123", 1.2f) );
p.add( new Product("C0123", 0.2f) );
//retrieve the product for a given string:
Product prod;
prod = p.find("A0123");
o.addOrder(prod, 3);
prod = p.find("B0123");
o.addOrder(prod, 1);
prod = p.find("A0123");
o.addOrder(prod, 2);
prod = p.find("XXXX");
if (prod == null) {
System.out.println("Invali
}else {
o.addOrder(prod, 3);
}
//Print the orders as one long string
System.out.println(o);
//change the price of one of the products:
prod = p.find("B0123");
prod.price = 5.5f;
//add another order:
prod = p.find("B0123");
o.addOrder( prod, 10 );
//Print the orders as one long string
System.out.println(o);
}
}
class Product {
public String code;
public float price;
Product(String code, float price) {
this.code = code;
this.price = price;
}
}
class Products {
Hashtable allProducts = new Hashtable();
public void add( Product p ) {
allProducts.put(p.code, p );
}
public Product find( String code ) {
Product p = (Product)allProducts.get( code );
return p;
}
}
class Orders {
Hashtable allOrders = new Hashtable();
public void addOrder(Product prod, int quantity) {
int num = 0;
Integer numInt = (Integer)allOrders.get(pro
if (numInt != null) {
num = numInt.intValue();
}
num += quantity;
allOrders.put(prod, new Integer(num));
}
public int getOrder(Product prod) {
int num = 0;
Integer numInt = (Integer)allOrders.get(pro
if (numInt != null) {
num = numInt.intValue();
}
return num;
}
public String toString() {
int max = allOrders.size() - 1;
StringBuffer buf = new StringBuffer();
Iterator it = allOrders.entrySet().itera
while (it.hasNext()) {
Map.Entry e = (Map.Entry) (it.next());
Product prod = (Product)e.getKey();
buf.append(prod.code +"|"+ e.getValue() +"|"+ prod.price +"#");
}
return buf.toString();
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Mine does the decode, summarisation and encode, does than mean I'm the winnder? :)
My Product class is more contained ;-P
Hee hee!
Tim
Hee hee!
Tim
;-)
Mine demonstrates encapsulation using inner classes!
(Although in all fairness I could have added a toString() to the inner class)
:P
(Although in all fairness I could have added a toString() to the inner class)
:P
Oh well, you win ;-)
You then get lists of strings for item/price/quantity.
Store the items in a Hashtable, convert the quantity string to a int (Integer.parseInt if I remember well). Then put the Integer into the Hashtable as a value if there was no value, else sum the values to get the new Integer.
Now, what if your user types A123|10|29.9# which is a different price? How do you know which price is correct?
Your user should probably never have to type strings like that.
Why don't you give them a panel where they put a list of article/quantity? You could more easily generate your String afterwards.