0

I've searched up and down for the fix to my issue, but none seem to work. One particular reference-- this and this, and especially this. However, no matter how I implement them, I receive an OutOfBoundsError, which I can't understand.

The program is extra credit for a class. In truth, it is very simple--

Program Description: Use a two dimensional array to solve the following problem. A company has four sales persons (1 to 4) who sell five different products (1 to 5). Once a day, each salesperson passes in a slip for each different type of product sold. Each slip contains:

The sales persons number
The product number
The total dollar value of that product sold that day

Thus, each salesperson passes in between 0 and 5 sales slips per day. Assume that the information from all of the slips for last month is available. Each data line contains 3 numbers (the sales person number, product number, sales).

Write a program that will read all this information for last month’s sales, and summarize the total sales by salesperson by product.

The data provided:

1 2 121.77
1 4 253.66
1 5 184.22
1 1 97.55
2 1 152.44
2 2 104.53
2 4 189.97
2 5 247.88
3 5 235.87
3 4 301.33
3 3 122.15
3 2 301.00
3 1 97.55
4 1 125.66
4 2 315.88
4 4 200.10
4 3 231.45

The error only comes when it tries to calculate the columns. My rows work; no matter how I change the for-loop or any of the indeces in the row or column of the array, it doesn't work. I at first had my rows calculated separately, then my column sums, and it didn't work either. There is something that I'm missing that I'm clearly overlooking.

Here is my code:

import java.io.File;
import java.io.FileNotFoundException;
import java.text.DecimalFormat;
import java.util.Scanner;


public class prog480u {

    static Scanner inFile = null;

    public static void main(String[] args) {
        
        try {

            // create scanner to read file
            inFile = new Scanner(new File ("prog480u.dat"));

        } catch (FileNotFoundException e) {
            System.out.println("File not found!");
            System.exit(0);
        }
        
        // make the array
        
        int x = 0;
        int y = 0;
        
        double[][] profits = new double[4][5];
        
        while (inFile.hasNext()) {
        
            x = inFile.nextInt();   // use sales numbers as coordinates
            y = inFile.nextInt();
                                
                profits[x - 1][y - 1] = inFile.nextDouble();            
                
            }

        
        // check if it's okay

        
        System.out.println("");
        double[][] columnProfits = sums(profits);
        
        for (int a = 0; a < columnProfits.length; a++) {
            System.out.print((a+1) + "\t");
            for (int b = 0; b < columnProfits[a].length; b++) {
            System.out.print(columnProfits[a][b] + "\t");
        }
    
        System.out.println("");
        }

        double[] bottomRow = columnSums(columnProfits);
        
        for (int a = 0; a < bottomRow.length; a++) {
            
            System.out.print("Total:" + bottomRow + "\t");
            
        }

        
    }
    
    public static double[][] sums (double[][] q) {
        
        double[][] array = new double[5][6];
        array = q;

        double sum = 0;     
        
        for (int a = 0; a < array.length; a++) {
            
            for (int b = 0; b < array[0].length; b ++) {
                
                sum += array[a][b]; // add everything in the row
                
                
            }
            
            array[a][4] = sum;  // set that row to the last column
            
            sum = 0;    // reset sum to 0
            
        }
        
        return array;
    }
    
    public static double[] columnSums (double[][]q) {
        
        double[][] array = new double[5][6];
        array = q;
        
        double sum2 = 0;
        
        double[] columns = new double [5];

        for (int a = 0; a < array.length; a++) {
            
            for (int b = 0; b < array[0].length; b ++) {
                
                sum2 += array[b][a];
                
                columns[b] = sum2;
                
            }
            
            sum2 = 0;   // reset sum to 0
            
        }
        
        return columns;
    }
    
        
}
        

    
    

Thank you very much for your time. I have a feeling my program is close to working, but this small mistake is pushing me over the edge.

Community
  • 1
  • 1
Nikolas
  • 49
  • 1
  • 9

2 Answers2

2

Here's the working code (I cleaned it up a bit):

You were very close, you just needed to swap your max indicies in the for loops. That's why you were getting a java.lang.ArrayIndexOutOfBoundsException

public static double[] columnSums(double[][] q)
{
    double[][] array = q;

    double[] columns = new double[5];

    for (int a = 0; a < array[0].length; a++)
    {
        for (int b = 0; b < array.length; b++)
        {   
            columns[a] += array[b][a];
        }
    }
    return columns;
}
Michael Markidis
  • 4,163
  • 1
  • 14
  • 21
  • Goodness, thank you so much! I can't believe it was such a small error that threw me off that badly. I wish you many good days. – Nikolas Apr 27 '16 at 00:45
1

Just for fun, I wrote the object oriented version for that. Easier to handle once the system requires additional functionalities:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;



class Sale {

    static public ArrayList<Sale> readSales(final String pSalesFileName) throws FileNotFoundException, IOException {
        final ArrayList<Sale> ret = new ArrayList<>();
        try (final BufferedReader br = new BufferedReader(new FileReader(pSalesFileName))) {
            int lineIndex = 0;
            while (true) {
                ++lineIndex;
                final String line = br.readLine();
                if (line == null) {
                    System.out.println("Line #" + lineIndex + " is empty, skipping...");
                    break;
                }

                try {
                    final String[] values = line.split("\\s");
                    final int salesPersonId = Integer.parseInt(values[0]);
                    final int productId = Integer.parseInt(values[1]);
                    final float sales = Float.parseFloat(values[2]);
                    final Sale sale = new Sale(salesPersonId, productId, sales);
                    ret.add(sale);

                } catch (final ArrayIndexOutOfBoundsException e) {
                    System.err.println("Parse error in line #" + lineIndex + ": '" + line + "'");
                }
            }
        }
        return ret;
    }



    private final int   mSalesPersonId;
    private final int   mProductId;
    private final float mSales;

    public Sale(final int pSalesPersonId, final int pProductId, final float pSales) {
        mSalesPersonId = pSalesPersonId;
        mProductId = pProductId;
        mSales = pSales;
    }

    public Integer getSalesPersonId_R() {
        return Integer.valueOf(mSalesPersonId);
    }
    public Integer getProductId_R() {
        return Integer.valueOf(mProductId);
    }
    public float getSales() {
        return mSales;
    }
}



class SalesPerson {
    private final HashMap<Integer, ArrayList<Sale>> mSalesMap   = new HashMap<>();

    private final int                               mId;

    public SalesPerson(final int pId) {
        mId = pId;
    }

    @Override public boolean equals(final Object pObj) {
        if (!(pObj instanceof SalesPerson)) return false;
        return ((SalesPerson) pObj).mId == mId;
    }
    @Override public int hashCode() {
        return mId;
    }

    public void addSale(final Sale pSale) {
        final Integer productId = pSale.getProductId_R();
        ArrayList<Sale> salesList = mSalesMap.get(productId);
        if (salesList == null) {
            salesList = new ArrayList<>();
            mSalesMap.put(productId, salesList);
        }
        salesList.add(pSale);
    }
    public Integer getId_R() {
        return Integer.valueOf(mId);
    }
    public HashMap<Integer, ArrayList<Sale>> getSalesMap() {
        return mSalesMap;
    }

    public float getSalesTotalByProductId(final Integer pProductId) {
        final ArrayList<Sale> sales = mSalesMap.get(pProductId);
        float accumulator = 0;
        for (final Sale sale : sales) {
            accumulator += sale.getSales();
        }
        return accumulator;
    }
}



public class SalesFun {

    public static void main(final String[] args) throws FileNotFoundException, IOException {
        final ArrayList<Sale> sales = Sale.readSales("test/sales.txt");

        final HashMap<Integer, SalesPerson> personMap = new HashMap<>();
        for (final Sale sale : sales) {
            // find right salesperson or create new, then add sale to it
            final Integer salesPersonId = sale.getSalesPersonId_R();
            SalesPerson person = personMap.get(salesPersonId);
            if (person == null) {
                person = new SalesPerson(salesPersonId.intValue());
                personMap.put(salesPersonId, person);
            }
            person.addSale(sale);
        }

        printSales(personMap);
    }

    static private void printSales(final HashMap<Integer, SalesPerson> pPersonMap) {
        for (final SalesPerson person : pPersonMap.values()) {
            System.out.println("SalesMan ID: " + person.getId_R());
            for (final Entry<Integer, ArrayList<Sale>> entry : person.getSalesMap().entrySet()) {
                final Integer productId = entry.getKey();
                final float sales = person.getSalesTotalByProductId(productId);
                System.out.println("\tProduct ID: " + entry.getKey() + "\tSales: " + sales);
            }
        }
    }

}
JayC667
  • 2,418
  • 2
  • 17
  • 31
  • Hello! Thank you, this looks so strange and interesting. I'll hold onto it and hopefully understand it some distant day. – Nikolas Apr 27 '16 at 00:45