Ammar
Ammar

Reputation: 31

search an array of Object

Hi I'm trying to create a GUI program that allows the user to search for a certain student using either ID or name (assume they are both unique) from a student database and then display the information such as name, id , gpa.

like if i search using the name or the id the student info should be display on the lower part of the gui program where the JLabel (student info)

a sample of the student database file

12345 Mark 3.6
72305 Sam 2.8
12945 Chris 3.1
18325 John 2.5
52341 Drake 2.7
98475 Sara 3.8
24536 Robin 3.1
34765 Ted 3.6
23845 Kelly 3.1

i couldn't get why I'm getting an error when searching by name or id? also how can i display student info after searching ?

and yes i'm using to different searching methods one for the Name and the other for the ID

here's my code

 import java.awt.*;
 import java.awt.event.*;
 import java.io.*;   
 import java.util.*;
 import javax.swing.*;


 public class GUIProgram extends JFrame implements ActionListener {

JLabel name, id, stInfo;
JButton clearBtn, searchName, searchID;
JTextField nameTxt, idTxt, nameInfo, idInfo, gpaInfo;
int i ;
String n;
public static void main(String[] args) {
    new GUIProgram();
}


public GUIProgram(){
    super("GUIProgram");
    setTitle("Student Database");
    setLayout(new FlowLayout());
    setSize(480, 200);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    JPanel searchPanel = new JPanel(new FlowLayout());
    name = new JLabel("Name: ");
    nameTxt = new JTextField(10);
    id = new JLabel("ID: ");
    idTxt = new JTextField(10);
    clearBtn = new JButton("Clear");
    clearBtn.addActionListener(this);

    searchPanel.add(name);
    searchPanel.add(nameTxt);
    searchPanel.add(id);
    searchPanel.add(idTxt);
    searchPanel.add(clearBtn);
    add(searchPanel,BorderLayout.NORTH);

    JPanel centerPanel = new JPanel(new FlowLayout());
    searchName = new JButton("Search By Name");
    searchID = new JButton("Search By ID");

    centerPanel.add(searchName);
    centerPanel.add(searchID);
    add(centerPanel,BorderLayout.CENTER);

    JPanel infoPanel = new JPanel(new FlowLayout());

    stInfo = new JLabel("Student Info: ");
    nameInfo = new JTextField(10);
    nameInfo.setEditable(false);
    idInfo = new JTextField(10);
    idInfo.setEditable(false);
    gpaInfo = new JTextField(10);
    gpaInfo.setEditable(false);

    infoPanel.add(stInfo);
    infoPanel.add(nameInfo);
    infoPanel.add(idInfo);
    infoPanel.add(gpaInfo);

    add(infoPanel,BorderLayout.SOUTH);

    searchID.addActionListener(this);
    searchName.addActionListener(this);

    setVisible(true);

}

public void actionPerformed(ActionEvent ae) {
    Object source = ae.getSource();
    if (source == clearBtn);
    nameTxt.setText("");
    idTxt.setText("");

    try{
        Scanner file = new Scanner(new File("StudentDB.txt"));

        ArrayList<Integer> id = new ArrayList<Integer>();
        ArrayList<String> name = new ArrayList<String>();
        ArrayList<Double> gpa = new ArrayList<Double>();

        while(file.hasNext()){
            id.add(file.nextInt());
            name.add(file.next());
            gpa.add(file.nextDouble());
        }

        Student [] stList = new Student[9];
        for(int i = 0; i < name.size(); i++){
            stList[i] = new Student(id.get(i), name.get(i), gpa.get(i));
        }

        n = nameTxt.getText(); 
        i = Integer.parseInt(idTxt.getText());
        try {

            if(source == searchName){
                linearSearch(stList, n);

            }
            else if(source == searchID){
                binarySearch(stList, i);
            }
        }catch(InputMismatchException e){
            JOptionPane.showMessageDialog(null, "Input Mismatch Exception");
        }

    }catch(InputMismatchException | FileNotFoundException e){
        JOptionPane.showMessageDialog(null, "Input Mismatch Exception");
    }


} 

/*static final int NONE = -1; // not a legal index
static int linearSearch(int id, Student[] a) {
for (int i = 0; i < a.length; i++) {
    if (id == a[i]) 
return i;   
}
return NONE;
}*/

static final int NONE = -1;  // not a legal index
static int linearSearch(Student[] a, String name) {
    for (int p = 0; p < a.length; p++) {    
        if (name.equals(a[p])) 

            return p;
        }   
    return NONE; 
    }


public static int binarySearch(Student[] a, int x) {
    int low = 0;
    int high = a.length - 1;
    int mid;

    while (low <= high) {
        mid = (low + high) / 2;

        if (a[mid].compareTo(x) < 0) {
            low = mid + 1;
        } else if (a[mid].compareTo(x) > 0) {
            high = mid - 1;
        } else {
            return mid;
        }
    }

    return -1;
}


class Student implements Comparable{
     int iDNumber;
     String name;
     double gpa;

    public Student(int iDNumber, String name, double gpa){
        this.iDNumber = iDNumber;
        this.name = name;
        this.gpa = gpa;
    }
    public int getiDNumber() {
        return iDNumber;
    }
    public void setiDNumber(int newId) {
        this.iDNumber = newId;
    }
    public void setGpa(double newGpa) {
        this.gpa = newGpa;
    }
    public void setName(String newName) {
        this.name = newName;
    }
    public String getName() {
        return name;
    }
    public double getGPA() {
        return gpa;
    }

    public String toString(){
        return iDNumber+"\t"+name+"\t"+gpa;
    }


    public int compareTo(Object o) {
        if(o == null) {
            throw new NullPointerException();
            }
        else if(o.getClass()!= getClass()) {
                throw new ClassCastException();
            }
        else if(o.getClass()== getClass()) {
                Student st = (Student) o;
                return iDNumber - st.getiDNumber();
            }
            else {

                Student st = (Student) o;
                return (int) (gpa - st.getGPA());
        }
    }



} // end of st



class ComparatorId implements Comparator {
    public int compare(Object o1, Object o2) {
        if(o1 == null | o2 == null)
            throw new NullPointerException();
        else {
            if(!(o1 instanceof Student) | !(o2 instanceof Student))
                throw new ClassCastException();
            else {
                Student st1 = (Student) o1;
                Student st2 = (Student) o2;
                return st1.getiDNumber() - st2.getiDNumber();
            }
        }
    } 
} // End of ComparatorId class


class ComparatorGPA implements Comparator {
    public int compare(Object o1, Object o2) {

        if(o1 == null | o2 == null)
            throw new NullPointerException();
        else {
            if(!(o1 instanceof Student) | !(o2 instanceof Student))
                throw new ClassCastException();
            else {
                Student st1 = (Student) o1;
                Student st2 = (Student) o2;
                return Double.compare(st1.getGPA(), st2.getGPA());

        //  return ((Student) o1).getGPA().compareTo2((Student) o2).getGPA()));
         // return (int)(((Student) o1).getGPA()).compareTo2((Double)o1.getGPA());
    }
        }
    }
} // End of ComparatorGPA class

class ComparatorName implements Comparator {
    public int compare(Object o1, Object o2) {
        return ((Student) o1).getName().compareTo(((Student) o2).getName());

    }
}// End of ComparatorName class
}

the program looks like this

Sample of the GUI Program interface

Upvotes: 0

Views: 875

Answers (1)

Dax Loy
Dax Loy

Reputation: 172

There are a few problems with the code you have written, mainly just small bugs.

The item that is giving you the error is the line i=Integer.parseInt(idTxt.getText()); as this line tries to get whatever is in the idTxt box and convert it to an int. This works fine if you put in a number there but when you do not and only want to search by name it leaves it blank or "". It tries to parse that empty string since you parse it before checking if the action source is equal to searchID. If you do the parsing once you know there is a number in the Text field you will not get the error. EG:

if(source == searchID){
   i=Integer.parseInt(idTxt.getText());
}

Also, in your LinearSearch method you are doing name.equals(a[p]) you are seeing if a String object is equal to a Student object. You could instead do something like name.compareTo(a[p].getName()) which would directly compare the two Strings to see if they are equal.

Finally, you are using a binary search of the Student ID which you could use if you first sort the Student Array because binary search only works on sorted Arrays. I would just use an overloaded version of your LinearSearch method that takes an int and compares against the id in the Student object.

Upvotes: 2

Related Questions