java - 搜索对象数组

标签 java arrays user-interface search arraylist

嗨,我正在尝试创建一个 GUI 程序,允许用户使用 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

最佳答案

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

给您带来错误的项目是行 i=Integer.parseInt(idTxt.getText()); 因为该行尝试获取 idTxt 框中的所有内容并将其转换为一个整数。如果您在此处输入数字,则效果很好,但是当您不输入数字并且只想按名称搜索时,它会将其保留为空白或“”。它会尝试解析该空字符串,因为您在检查操作源是否等于 searchID 之前解析它。如果您在知道文本字段中有数字后进行解析,则不会收到错误。 例如:

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

此外,在您的 LinearSearch 方法中,您正在执行 name.equals(a[p]) 您正在查看 String 对象是否等于 Student 对象。您可以执行类似 name.compareTo(a[p].getName()) 的操作,它会直接比较两个字符串以查看它们是否相等。

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

关于java - 搜索对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47637649/

相关文章:

java - Android if 语句在 runnable 中并不总是触发

arrays - 按 2 个条件对数组的数组进行排序

ruby - 如何按长度对 Ruby 字符串数组进行排序?

android - 使用阴影层绘画 - 如何更改 alpha

JavaFX - 获取 GridPane 以适应父级

java - 如何为不同行具有不同列号的 Excel 工作表编写 TestNG DataProvider 注释

java - GWT 在服务器启动时执行 Liquibase 脚本

android在后台加载webView并且不显示gui

java - 减少圈复杂度问题

arrays - 找出 m 和 n 之间的所有整数,这些整数的平方和本身就是一个平方