搜索一个Object数组

时间:2017-12-04 16:20:58

标签: java arrays user-interface search arraylist

您好我正在尝试创建一个GUI程序,允许用户使用ID或ID搜索某个学生 学生数据库中的名称(假设它们都是唯一的),然后显示名称,ID,gpa等信息。

如果我使用姓名或ID搜索,学生信息应显示在gui程序的下半部分,其中JLabel(学生信息)

学生数据库文件的样本

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

我无法理解为什么在按名称或ID搜索时出现错误? 我怎样才能在搜索后显示学生信息?

是的,我正在使用不同的搜索方法,一个用于名称,另一个用于ID

这是我的代码

 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
}

程序看起来像这样

Sample of the GUI Program interface

1 个答案:

答案 0 :(得分:2)

您编写的代码存在一些问题,主要是小错误。

给你错误的项是行CGFloat screenWidth = 320.0; CGSize actualContentSize = CGSizeMake(3000, 3000); [scrlViewQuestion setContentSize:CGSizeMake(screenWidth, actualContentSize.height)]; [scrlViewQuestion setContentInset:UIEdgeInsetsMake(0, -x, 0, 0)]; ,因为这行试图获取idTxt框中的任何内容并将其转换为int。如果你在那里输入一个数字,但是当你没有,并且只想按名称搜索时,它可以保留空白或“”。它会尝试解析该空字符串,因为在检查操作源是否等于searchID之前解析它。如果您在知道文本字段中有数字后进行解析,则不会收到错误。 EG:

i=Integer.parseInt(idTxt.getText());

此外,在您的LinearSearch方法中,您正在查看String对象是否等于Student对象。if(source == searchID){ i=Integer.parseInt(idTxt.getText()); } 您可以改为执行类似name.equals(a[p])的操作,直接比较两个字符串,看它们是否相等。

最后,您正在使用学生ID的二进制搜索,如果您首先对学生数组进行排序,则可以使用它,因为二进制搜索仅适用于已排序的数组。我只使用一个重载版本的LinearSearch方法,该方法接受一个int并与Student对象中的id进行比较。

相关问题