views:

71

answers:

3

I have a multidimensional array built from Strings that is initially created with the size [50][50], this is too big and now the array is full of null values, I am currently trying to remove these said null values, I have managed to resize the array to [requiredSize][50] but cannot shrink it any further, could anyone help me with this? I have scoured the internet for such an answer but cannot find it.

Here is my complete code too (I realise there may be some very unclean parts in my code, I am yet to clean anything up)

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

public class FooBar
{
  public static String[][] loadCSV()
  {
    FileInputStream inStream;
    InputStreamReader inFile;
    BufferedReader br;
    String line;
    int lineNum, tokNum, ii, jj;
    String [][] CSV, TempArray, TempArray2;

    lineNum = tokNum = ii = jj  = 0;
    TempArray = new String[50][50];

    try
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Please enter the file path of the CSV");
        String fileName = in.readLine();
        inStream = new FileInputStream(fileName);
        inFile = new InputStreamReader(inStream);
        br = new BufferedReader(inFile);
        StringTokenizer tok,tok2;


        lineNum = 0;
            line = br.readLine();
            tokNum = 0;
            tok = new StringTokenizer(line, ",");

            while( tok.hasMoreTokens())
            {
                TempArray[tokNum][0] = tok.nextToken();
                tokNum++;
            }
            tokNum = 0;
            lineNum++;

            while( line != null)
            {
                    line = br.readLine();
                    if (line != null)
                    {
                        tokNum = 0;
                        tok2 = new StringTokenizer(line, ",");

                        while(tok2.hasMoreTokens())
                        {
                            TempArray[tokNum][lineNum] = tok2.nextToken();
                            tokNum++;
                        }
                    }
                    lineNum++;
            }
    }    
    catch(IOException e)
    {
        System.out.println("Error file  may not be accessible, check the path and try again");
    }

    CSV = new String[tokNum][50];
    for (ii=0; ii<tokNum-1 ;ii++)
    {
        System.arraycopy(TempArray[ii],0,CSV[ii],0,TempArray[ii].length);
    }
    return CSV;
}    
public static void main (String args[])
{
    String [][] CSV;
    CSV = loadCSV();
    System.out.println(Arrays.deepToString(CSV));
}
}                

The CSV file looks as follows

Height,Weight,Age,TER,Salary
163.9,46.8,37,72.6,53010.68
191.3,91.4,32,92.2,66068.51
166.5,51.1,27,77.6,42724.34
156.3,55.7,21,81.1,50531.91

It can take any size obviously but this is just a sample file.

I just need to resize the array so that it will not contain any null values.

I also understand a list would be a better option here but it is not possible due to outside constraints. It can only be an multi dimensional array.

A: 

I think you need 3 changes to your program

  • After your while loop lineNum will be 1 more than the number of lines in the file so instead of declaring CSV to String[tokNum][50] declare it as CSV = new String[tokNum][lineNum-1];
  • tokNum will be the number of fields in a row so your for loop condition should be ii<tokNum rather than ii<tokNum-1
  • The last parameter for your arraycopy should be lineNum-1

i.e. the modified code to build your CSV array is:

CSV = new String[tokNum][lineNum-1];
for (ii=0; ii<tokNum ;ii++)
{
    System.arraycopy(TempArray[ii],0,CSV[ii],0,lineNum-1);
}

and the output will then be:

[[Height, 163.9, 191.3, 166.5, 156.3], [Weight, 46.8, 91.4, 51.1, 55.7], 
[Age, 37, 32, 27, 21], [TER, 72.6, 92.2, 77.6, 81.1],
[Salary, 53010.68, 66068.51, 42724.34, 50531.91]]

Notice that you don't really need to handle the first line of the file separately from the others but that is something you can cover as part of your cleanup.

mikej
Thanks this is exactly what I was trying to do, I swear that is what I tried, it was late at night I may have made a mistake and tried the same thing several times. Thanks a bunch, I would press the up arrow on your answer but I dont have the required reputation
Aaron
@Aaron Glad it helped. PS. you can upvote answers to your *own* questions regardless of how much reputation you have.
mikej
A: 

10 to 1 this is a homework assignment. However, it looks like you've put somethought into it.

Don't make the TempArray variable. Make a "List of List of Strings". Something like:

List<List<String>> rows = new ArrayList<ArrayList<String>>();

while(file.hasMoreRows()) {            //not valid syntax...but you get the jist
  String rowIText = file.nextRow();    //not valid syntax...but you get the jist
  List<String> rowI = new ArrayList<String>(); 

  //parse rowIText to build rowI --> this is your homework

  rows.add(rowI);

}

//now build String[][] using fully constructed rows variable
Ivan
A: 

Here's an observation and a suggestion.

Observation: Working with (multidimensional) arrays is difficult in Java.

Suggestion: Don't use arrays to represent complex data types in Java.

Create classes for your data. Create a List of people:

class Person {
    String height;  //should eventually be changed to a double probably
    String weight;  // "
    //...

    public Person( String height, String weight /*, ... */ ) {
       this.height = height;
       this.weight = weight;
       //...
    }
}

List<Person> people = new ArrayList<Person>();
String line;
while ( (line = reader.nextLine()) != null ) {
    String[] records = line.split(",");
    people.add(new Person (records[0], records[1] /*, ... */));
}
Mark Peters
I would have done this however, I cannot guarantee that the CSV file will be using those same headers each time, that is just a sample CSV with correct formatting, I never know what the data could actually hold
Aaron