Colin
Colin

Reputation: 35

How to fill a multidimensional array dependant on variables

The program I am working on is a simple shipping program. What I am having difficulty with is populating a multidimensional array factoring in certain variables.

Example

320 items need to be shipped out to 1 receiver using different box sizes.

Use the least number of boxes so far.

Code

This is my code so far.

import java.util.Scanner;

public class Shipping {
    public static void main(String [] args) {
        Scanner kbd = new Scanner(System.in);

        final int EXTRA_LARGE = 50;
        final int LARGE = 20;
        final int MEDIUM = 5;
        final int SMALL = 1;

        String sBusinessName = "";
        int iNumberOfGPS = 0;

        int iShipmentCount = 0;

        displayHeading(kbd);
        iShipmentCount = enterShipments(kbd);
        int[][] ai_NumberOfShipments = new int [iShipmentCount][4];
        String[] as_BusinessNames = new String [iShipmentCount];

        for (int iStepper = 0; iStepper < iShipmentCount; iStepper++) {
            sBusinessName = varifyBusinessName(kbd);
            as_BusinessNames[iStepper] = sBusinessName;
            iNumberOfGPS = varifyGPS(kbd);
            calculateBoxes(ai_NumberOfShipments[iStepper],iNumberOfGPS, EXTRA_LARGE, LARGE, MEDIUM, SMALL);
        }
        //showArray(as_BusinessNames);
    }

    public static void displayHeading(Scanner kbd) {
        System.out.println("Red River Electronics");
        System.out.println("Shipping System");
        System.out.println("---------------");

        return;
    }

    public static int enterShipments(Scanner kbd) {
        int iShipmentCount = 0;
        boolean bError = false;
        do {
            bError = false;
            System.out.print("How many shipments to enter? ");
            iShipmentCount = Integer.parseInt(kbd.nextLine());

            if (iShipmentCount < 1) {
                System.out.println("\n**Error** - Invalid number of shipments\n");
                bError = true;
            }
        } while (bError == true);

        return iShipmentCount;
    }

    public static String varifyBusinessName(Scanner kbd) {
        String sBusinessName = "", sValidName = "";
        do {
            System.out.print("Business Name: ");
            sBusinessName = kbd.nextLine();

            if (sBusinessName.length() == 0) {
                System.out.println("");
                System.out.println("**Error** - Name is required\n");
            } else if (sBusinessName.length() >= 1) {
                sValidName = sBusinessName;
            }
        } while (sValidName == "");

        return sValidName;
    }

    public static int varifyGPS(Scanner kbd) {
        int iCheckGPS = 0;
        int iValidGPS = 0;
        do {
            System.out.print("Enter the number of GPS receivers to ship: ");
            iCheckGPS = Integer.parseInt(kbd.nextLine());

            if (iCheckGPS < 1) {
                System.out.println("\n**Error** - Invalid number of shipments\n");
            } else if (iCheckGPS >= 1) {
                iValidGPS = iCheckGPS;
            }
        } while(iCheckGPS < 1);

        return iValidGPS;   
    }
    
    public static void calculateBoxes(int[] ai_ToFill, int iNumberOfGPS) {
        for (int iStepper = 0; iStepper < ai_ToFill.length; iStepper++)
    }

    //public static void showArray( String[] ai_ToShow) {
    //    for (int iStepper = 0; iStepper < ai_ToShow.length; iStepper++) {
    //        System.out.println("Integer at position " + iStepper + " is " + ai_ToShow[iStepper]);
    //    }
    //}
}

Upvotes: 2

Views: 203

Answers (1)

Jason
Jason

Reputation: 11822

Change your definition of calculateBoxes() to also take an array that represents the volume of each of the boxes (in your case this will be {50, 20, 5, 1}:

public static void calculateBoxes(int[] ai_ToFill, int[] boxVolumes, int iNumberOfGPS) {
    // for each box size
    for (int iStepper = 0; iStepper < ai_ToFill.length; iStepper++) {
        // while the remaining items to pack is greater than the current box size
        while(iNumberOfGPS >= boxVolumes[iStepper]) {
            // increment the current box type
            ai_ToFill[iStepper]++;
            // subtract the items that just got packed
            iNumberOfGPS -= boxVolumes[iStepper];
        }
    }
}

Another way of calculating this (using / and % instead of a while loop) would be:

public static void calculateBoxes(int[] ai_ToFill, int[] boxVolumes, int iNumberOfGPS) {
    // for each box size
    for (int iStepper = 0; iStepper < ai_ToFill.length; iStepper++) {
        if(iNumberOfGPS >= boxVolumes[iStepper]) {
            // calculate the number of boxes that could be filled by the items
            ai_ToFill[iStepper] = iNumberOfGPS/boxVolumes[iStepper];
            // reset the count of items to the remainder
            iNumberOfGPS = iNumberOfGPS%boxVolumes[iStepper];
        }
    }
}

Upvotes: 1

Related Questions