user4345738
user4345738

Reputation: 191

calling a method(constructor) from main & file format

I have a constructor ID3 and I need to start by executing it from the main. Is it possible?

I tried doing this:

public class ID3
{

    public static void main(String[] args) throws Exception 
    {
        System.out.print("\f"); //clears the screen
        ID3 instance = new ID3("data.txt", 5 , 14 , "", 5);

        instance.ID3("data.txt", 3 , 5 , " ", 2); //error given here since this line had to be removed
    }

 public ID3(String fName, int numAttributes, int testCases, String delimiter, int limitSplits) throws IOException, FileNotFoundException
 {

    fileName = fName;
    n = numAttributes;
    t = testCases;
    numSplits = limitSplits;
    FileInputStream fstream = new FileInputStream(fileName);
    DataInputStream in = new DataInputStream(fstream);
    //Parse the first line to see if continuous or discrete attributes.
    firstLine = new String[n];
    firstLine = in.readLine().split(delimiter);
    int i, j, lineCount = 0;
    for(i=0; i<n; i++)
        unusedAttr.add(new Integer(i));
    input = new String[t][n+1];
    String line;
    int invalidLines = 0;
    while((lineCount + invalidLines)<t)
    {
        try
        {
            input[lineCount] = (in.readLine()).split(delimiter);
        }
        catch(NullPointerException e)
        {
            invalidLines++;continue;
        }
        if (Array.getLength(input[lineCount]) != n+1 || (Array.get(input[lineCount],n).toString().compareTo("?") == 0)) //number of attributes provided in the line is incorrect.
        {
            invalidLines++;continue;
        }
        lineCount++;
    }
    if(invalidLines == t)
    {
        System.out.println("All lines invalid - Check the supplied attribute number");
        System.exit(0);
    }
    if (invalidLines > 0)
        System.out.println("Not Considering "+invalidLines+" invalid training cases");
    if(numSplits > maxSplits || numSplits > (t/2))
    {
        System.out.println("numSplits should be less than or equal to "+Math.min(t/2,limitSplits));
        System.exit(1);
    }
    t = testCases - invalidLines;
    thresholdVal = new String[n][numSplits - 1];
    boolean allCont = false;
    if(Array.getLength(firstLine) == 1)
    {
        if(firstLine[0].compareTo("c") == 0)
            allCont = true;
        else if(firstLine[0].compareTo("d") == 0)
            return;
        else
        {
            System.out.println("Invalid first line - it should be c or d");
            System.exit(1);
        }
    }
    for(i=0; i<n; i++)
    {
        if(allCont || firstLine[i].compareTo("c") == 0) //Continuous Attribute
        {
            for(j=0; j<numSplits-1; j++)
                thresholdVal[i][j] = calculateThreshold(i,j);
        }
        else if(firstLine[i].compareTo("d") != 0)
        {
            System.out.println("Invalid first line - Training data (it should specify if the attributes are c or d)");
            System.exit(1);
        }
    }
    for(i=0; i<t; i++)
    {
        for(j=0; j<n; j++)
        {
            if(allCont || firstLine[j].compareTo("c") == 0)
                input[i][j] = makeContinuous(input[i][j], j);
        }
    }
}

The code for the constructor is shown above, however it finds the file but doesn't process the data and prints the errors out. How should the file be exactly?

Used text file has:

d
Span Shape Slab
long square waffle
long rectangle waffle
short square two-way
short rectangle one-way

Upvotes: 1

Views: 39

Answers (3)

Bajal
Bajal

Reputation: 6006

Contructors are not methods. One of the key feature of a method is that it should have a return type (event if it is 'void').

Here, you do not need to explicitly call the constructor again. The functionality you implement in the constructor will be executed at instantiation itself. However, this is not recommended and is bug-prone. You should only be instantiating any variables. The actual functionality should be defined in another method.

Upvotes: 0

Spikatrix
Spikatrix

Reputation: 20244

You cannot call constructors like regular methods. The constructor is automatically called when you create an instance of a class,i.e,when you do

ID3 instance = new ID3("data.txt", 5 , 14 , "", 5);

Upvotes: 0

Eran
Eran

Reputation: 393956

You are already calling the constructor here - ID3 instance = new ID3("data.txt", 5 , 14 , "", 5);. You can't call it as a regular method. Just remove the instance.ID3("data.txt", 5 , 14 , "", 5); line.

Upvotes: 1

Related Questions