Andrew Dao
Andrew Dao

Reputation: 1

I need help making Lowest price grocery program in Java

My code below

import java.util.*;
import java.io.*;

public class main {
    public int finalcost;

    public static void main(String[] args) throws FileNotFoundException, IOException {
        Scanner input = new Scanner(System.in);
        int totalAdd = 0;
        boolean done = false;
        // to store specific properties ex item size and price
        HashMap<String, String> specificPropsMap = new HashMap<String, String>();

        // stores an array list of all the sizes and price
        ArrayList<HashMap<String, String>> propsList = new ArrayList<HashMap<String, String>>();

        // the item list stores the name of the item as the KEY and item size and price
        // as data
        HashMap<String, ArrayList<HashMap<String, String>>> itemsMap = new HashMap<String, ArrayList<HashMap<String, String>>>();

        // this stores the service name than the cost.this is the one we will be adding
        // too after getting the data;
        HashMap<String, Integer> cartMap = new HashMap<String, Integer>();

        BufferedReader br = new BufferedReader(new FileReader("PA2.txt"));
        String line = br.readLine();
        while ((line = br.readLine()) != null) {
            // stores the data base on commas
            String[] fields = line.split(",");
            String serviceName = fields[0];
            String fileName = fields[1];
            String cost = fields[2];

            if (specificPropsMap.containsKey(serviceName)) {
                // do nothing
            } else {
                specificPropsMap.put(serviceName, null);
            }
            // gets the file name from the first reader
            BufferedReader brCVS = new BufferedReader(new FileReader(fileName));
            String lineCVS = brCVS.readLine();
            while ((lineCVS = brCVS.readLine()) != null) {
                String[] cvsFields = lineCVS.split(",");
                String brandName = cvsFields[0];
                String nameItem = cvsFields[1];
                String itemSize = cvsFields[2];
                String itemPrice = cvsFields[3];

                // check if itemname is in specificPropsMap
                if (specificPropsMap.containsKey(cvsFields[1])) {
                    // do nothing
                } else {
                    specificPropsMap.put(itemSize, nameItem);
                }

                propsList.add(specificPropsMap);

                if (itemsMap.containsKey(nameItem)) {
                    // do nothing
                } else {
                    itemsMap.put(nameItem, null);
                }

            } // end inner while loop

            int stringCosttoInt = Integer.parseInt(cost.trim());
            if (cartMap.containsKey(serviceName)) {
                // do nothing
            } else {
                cartMap.put(serviceName, stringCosttoInt);
            }
        } // end outer while loop

        System.out.println("Welcome to Assisgnment two app");

        while (done == false) {

            System.out.println("Enter the item you are looking for or enter done check out: ");

            String key = input.nextLine(); // use key to find if item is in the itemsMap;
            if (key == "done") {
                done = true;
            } else {
                if (itemsMap.containsKey(key)) {
                    System.out.println("Enter the Size you want :");
                    // now check for the item name, than size, if not return item not there;
                    int sizeKey = input.nextInt(); // use key to find item in the area
                    if (itemsMap.containsValue(specificPropsMap.containsKey(sizeKey))) {

                        System.out.println("How many of " + key + " do you want:");
                        int numOfProduct = input.nextInt();

                        // add it to the cart;
                    } else {
                        System.out.println("No: " + sizeKey + " in the system");

                    }
                } else {
                    System.out.println("No item by the name of: " + key + " in the system");
                }
            }
        }
        br.close();

        input.close();
    }

}


Question: How do I set the user input to search the item class to return the lowest total cost. The user enters item name, size and the amount. I know in storing the name in item, but I don't know how to match it with user input or how to get that data if that makes sense.2nd in also little confused when I read the file and i'm storing it as a String, I don't know how to make it into an int so I can do math with it..

Upvotes: 0

Views: 666

Answers (1)

Bojan Krkic
Bojan Krkic

Reputation: 477

Just to give you some help with the approach, I won't be going into detail about parsing, I think you got that covered.

Look at it from another perspective, from the input. What is the flow of the program?

  • User enters required item and size
  • Look if item is present
  • User enters quantity
  • Add to cart
  • Repeat
  • When 'done', check which Service offers lowest total price

Note: Assuming an item present in one Brand is present in all

So let's devise a Data Structure that can support this:

  • We need to maintain a Cart for each Service. In the end, we can cycle through each cart and return the lowest.
    • Maintain a Map<String, Integer> where String is the Service, and Integer is the total price
    • Whenever an Item is added by the user, add the price of that Item to each respective Service
    • Eg. If Lays is added, add price of Lays in Prime to total price of Prime, price of Lays in InstaCart to total price of InstaCart, etc
  • First thing you need to look up is if the Item is present; we can store it in a Map, say itemsMap.
  • What specific properties does each item have? There's service, brand, size, price. We can store it in another Map, say specificPropsMap.
  • Each Item can have multiple specific properties. i.e., There can be different combination of size, service, etc. for the same Item. So each Item needs to store multiple specific properties, which can be a List, say propsList.

To understand the above:

//Starting from the bottom-up
//To store specific properties
//Contains key-value pairs like: service = Amazon, brand = Nestle, size = 10g, price = 2
HashMap<String, String> specificPropsMap; //Has one set of specific props

//Consider an Item; it can have multiple specific properties, which we'll store as a List
//Eg: For Item = 'dark chocolate'
//specificProps1: service = Amazon, brand = Nestle, size = 10, price = 2
//specificProps1: service = InstaCart, brand = Cadbury, size = 10, price = 3
//Required: List<specificPropsMap> 
ArrayList<HashMap<String, String>> propsList; //Has a list of specificPropsMaps for one item

//Now we need to store all Items; it can be a Map
//Required: Map<ItemName, propsList for that Item>
HashMap<String, ArrayList<HashMap<String, String>>> itemsMap;


//Initialize cart Map while parsing services
HashMap<String, Integer> cartMap; //Has initial values "Amazon" = 0, InstaCart = 0

//To find if an Item is present:
itemsMap.contains("Dark chocolate");

//Find prices from each service for that Item and size, and quantity
int reqSize = 10; //Assume req. size = 10
int reqQuantity = 5;
ArrayList<HashMap<String, String>> propsList = itemsMap.get("Dark chocolate")
for (HashMap<String, String> specificPropsMap : propsList) { //For each set of props
    int size = Integer.parseInt(specificPropsMap.get("size"));
    if (size == reqSize) {
        String service = specificPropsMap.get("service"); //Say Amazon
        int price = Integer.parseInt(specificPropsMap.get("price")); //Say 2
        int initialPriceInCart = cartMap.get(service); //Initially 0
        int finalPriceInCart = initialPriceInCart + price * reqQuantity;
        cartMap.put(service, finalPriceInCart); //Cart price updated
    }
}

//Find lowest priced service
String lowestPrice = Integer.MAX_VALUE; //Initially set as high as possible
String lowestService = "";
for (String key : cartMap.keySet()) {
    if (cartMap.get(key) < lowestPrice) {
        lowestPrice = cartMap.get(key);
        lowestService = key;
    }
}


General pointers that I can think of:
Population: Populate all these values initially while reading from the files.
Conversion : Convert values such as size, price to a standard (kg, cents/dollars, etc)
Naming : It's better to keep it descriptive (brand or brandName instead of bName)
Error handling : Add checks/try-catch blocks wherever necessary

Edit: Added steps. Might look a bit complex since we have some entries in the txt and some in the csv, but it's actually easy:

  • Read txt file; you now have a service and a csv file. Thus, for each service(outer loop)
    • Add the service as a key to cartMap if it's not already present
    • Create a new specificPropsMap, add service to this
  • Read the csv corresponding to that service. For each item(inner loop)
    • Store all props in the same specificPropsMap
    • You now have the prop item from the csv
    • Check if item is present in itemsMap
    • If present, skip to next step. If not, add item to the itemsMap as a key, with an empty List as value
    • Do itemsMap.get(item), you'll have the propsList
    • Add specificPropsMap to the propsList
  • Repeat for all items and all services.

Upvotes: 1

Related Questions