2016-04-26 4 views
0

Ich habe nach der Lösung für mein Problem gesucht, aber keine scheint zu funktionieren. Eine spezielle Referenz - this und und insbesondere this. Wie auch immer ich sie implementiere, ich erhalte einen OutOfBoundsError, den ich nicht verstehen kann.Summe der Spalten und Zeilen des 2D-Arrays

Das Programm ist extra Kredit für eine Klasse. In Wahrheit ist es sehr einfach -

Programmbeschreibung: Verwenden Sie ein zweidimensionales Array, um das folgende Problem zu lösen. Ein Unternehmen hat vier Verkäufer (1 bis 4), die fünf verschiedene Produkte verkaufen (1 bis 5). Einmal am Tag gibt jeder Verkäufer für jede verkaufte Produktart einen Beleg ein. Jeder Schlicker enthält:

Die Vertriebsmitarbeiter Nummer
Die Produktnummer
Der Gesamtdollarwert des Produkts an diesem Tag

So verkauft, jeder Verkäufer übergibt zwischen 0 und 5 Bons pro Tag. Nehmen Sie an, dass die Informationen aus allen Belegen des letzten Monats verfügbar sind. Jede Datenzeile enthält 3 Nummern (die Verkaufspersonennummer, die Produktnummer, den Umsatz).

Schreiben Sie ein Programm, das alle diese Informationen für Verkäufe des letzten Monats liest, und den Gesamtumsatz nach Verkäufer nach Produkt zusammenfasst.

Die zur Verfügung gestellten Daten:

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 

der Fehler nur kommt, wenn es um die Spalten zu berechnen versucht. Meine Zeilen funktionieren; Egal wie ich die for-Schleife oder irgendeine der indezes in der Zeile oder Spalte des Arrays ändere, es funktioniert nicht. Zuerst wurden meine Zeilen getrennt berechnet, dann addierte sich meine Spalte und es funktionierte auch nicht. Es gibt etwas, das mir fehlt und das ich klar übersehe.

Hier ist mein 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; 
    } 


} 

Vielen Dank für Ihre Zeit. Ich habe das Gefühl, dass mein Programm kurz davor steht zu arbeiten, aber dieser kleine Fehler treibt mich über den Rand.

+0

Es sieht aus wie Sie ein ‚+ =‘, kein ‚=‘ benötigen, wenn Sie die doppelte – mcraen

Antwort

2

Hier ist der Arbeitscode (Ich reinigte es ein wenig nach oben):

Sie waren ganz in der Nähe, die Sie gerade benötigt, um Ihre max indicies in der for-Schleifen zu tauschen. Deshalb sollten Sie waren eine für Spaß 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; 
} 
+0

Güte lesen, vielen Dank! Ich kann nicht glauben, dass es ein so kleiner Fehler war, der mich so sehr abwarf. Ich wünsche dir viele gute Tage. – Nikolas

1

gerade bekommen, schrieb ich die objektorientierte Version dafür. einfacher, wenn das System zu handhaben erfordert zusätzliche Funktionalitäten:

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); 
      } 
     } 
    } 

} 
+0

Hallo! Danke, das sieht so komisch und interessant aus. Ich werde mich daran halten und es hoffentlich an einem fernen Tag verstehen. – Nikolas