无法在数组中存储多个记录

时间:2017-12-01 15:10:10

标签: java

我正在尝试创建一个Book Database GUI,它在创建的数组中插入每本书的标题,作者和价格。 有一个搜索功能,可以按标题搜索数据库中的特定书籍。 但是我的代码似乎只适用于一本书,而不适用于多本书。 我想在这里输入10本书的详细信息。 我只能搜索最后创建的书。

我的代码如下:

class Book{
    public String title,author;
    public int price;
    Book(String t,String a,int p){
        this.title=t;
        this.author=a;
        this.price=p;
    }
}

class Swingdemo implements ActionListener{
    Book B[]=new Book[10];

    JLabel jl1;
    JTextField a1,a2,a3,a4;
    JButton j1,j2,j3;
    Swingdemo() {

        JFrame jfrm = new JFrame("Welcome");
        jfrm.setSize(180,300); 
        jfrm.setLayout(new FlowLayout());
        jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);
        a1 = new JTextField(8);

        a2 = new JTextField(8);

        a3 = new JTextField(8);

        j1 = new JButton("Create");

        a4 = new JTextField(8);

        j2 = new JButton("Search");
        jl1 = new JLabel("Press a Button");
        j1.setActionCommand("1");
        j2.setActionCommand("2");
        j1.addActionListener(this);
        j2.addActionListener(this);
        jfrm.add(a1);
        jfrm.add(a2);
        jfrm.add(a3);
        jfrm.add(j1);
        jfrm.add(a4);
        jfrm.add(j2);
        jfrm.add(jl1); 
        jfrm.setVisible(true);
    }

    int num=0;
    public void actionPerformed(ActionEvent ae){
        if(ae.getActionCommand().equals("1")){
            B[num]=new Book(a1.getText(),a2.getText(),Integer.parseInt(a3.getText()));
            jl1.setText("Book has been added");
            num++;
        }

        else{
            int i;
            for(i=0;i<B.length;i++){
                if(B[i].title.equals(a4.getText()))
                    jl1.setText("Book has been found");
            }
            if(i==B.length)         
                jl1.setText("Book was not found");
        }
    }

    public static void main(String []args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new Swingdemo();
            }
        });
    }
}

3 个答案:

答案 0 :(得分:1)

我更喜欢使用Optional包装而不是找到的

这样的局部变量
Optional<Book> mbyBook = Optional.empty();
for (Book b : B) {
    if (b.title.equals(a4.getText())) {
       mbyBook = Optional.of(b);
       break;
    }
}
if (mbyBook.isPresent()) {
    jl1.setText(String.format("Book has been found %s", mbyBook));
} else {
    jl1.setText("Book was not found");
}

答案 1 :(得分:1)

解决这样的问题的方法是将它与所有不相关的Swing东西分开,变成一个自己的方法:

public String findBook(String title) {
    int i;
    for(i=0;i<B.length;i++){
       if(B[i].title.equals(title))
           return("Book has been found");
       }
       if(i==B.length)         
          return("Book was not found");
    }
}

我在这里所做的就是从int i开始复制/粘贴您的代码,并将其放在方法中,传递title而不是直接查看Swing文本字段。然后我用setText替换了return s。

您可以通过将主代码中的整个块替换为:

来调用此方法
 jl1.setText(findBook(a4.getText());

现在该方法独立于Swing,您可以自行测试。

第一个问题是它不会编译。现在我们已经使用setText返回了return,编译器可以注意到,通过代码的路径并没有返回任何内容 - 其中所有if 1}} s是假的。

所以让我们通过在最后添加一个返回来编译它。我们还会添加大括号{},以便if在视觉上保持一致。永远不要遗漏大括号,即使编译器允许你。

public String findBook(String title) {
    for(int i=0;i<books.length;i++){
       if(books[i].title.equals(title))
          return("Book has been found");
       }
       if(i==books.length) {        
          return("Book was not found");
       }
    }
    return null;
}

我还将i的声明移到了初始化中。这是一种熟悉的形式。

我将B重命名为books。在Java中,我们倾向于描述变量名,变量总是以小写字母开头。

现在我们有一些可以编译的东西。一个好方法是在调试器中运行测试(您的IDE有一个)。但我们可以关注这些代码,并弄清楚当找不到这本书时会做些什么。

我们说B[]只有3个项目。 i从0开始。

  • 0 < 3?是。继续循环。
  • B[0]是否与标题相符?否。跳过if。
  • 0 == 3吗?否。跳过if。
  • i++ - i == 1
  • 1 < 3?是。继续循环。
  • B[1]是否与标题相符?否。跳过if。
  • 1 == 3吗?否。跳过if。
  • i++ - i == 2
  • 2 < 3?是。继续循环。
  • B[2]是否与标题相符?否。跳过if。
  • 2 == 3吗?否。跳过if。
  • i++ - i == 3
  • 3 < 3?不。退出循环。
  • return null

我们从未通过if(i==B.length)测试,因为我们只在i<B.length时输入该块。

return null被击中了。所以你可以通过在循环后放置not found响应来让它做你想做的事情:

public String findBook(String title) {
    for(int i=0;i<Books.length;i++){
       if(Books[i].title.equals(title))
          return("Book has been found");
       }
    }
    return("Book was not found");
}

答案 2 :(得分:0)

boolean found = false;
for(i=0;i<B.length;i++) {
    if(B[i].title.equalsIgnoreCase(a4.getText().trim())) {
        found = true;
        break;
    }
 }
 if(!found)         
     jl1.setText("Book was not found");
 else
     jl1.setText("Book has been found");

或者你也可以这样做,

for(i=0;i<B.length;i++) {
    if(B[i].title.equalsIgnoreCase(a4.getText().trim())) {
        break;
    }
 }
 if(B.length > 0 && i < B.length)         
     jl1.setText("Book has been found");
 else
     jl1.setText("Book was not found");