Java 无法在一个数组中存储多个记录
我正在尝试制作一个图书数据库GUI,在创建的数组中插入每本书的标题、作者和价格。 有一个搜索功能,可以根据书名搜索数据库中的特定书籍。 然而,我的代码似乎只适用于一本书,而不适用于多本书。 例如,我尝试在这里输入10本书的详细信息。 我只能搜索上一次创作的那本书 我的代码如下:Java 无法在一个数组中存储多个记录,java,Java,我正在尝试制作一个图书数据库GUI,在创建的数组中插入每本书的标题、作者和价格。 有一个搜索功能,可以根据书名搜索数据库中的特定书籍。 然而,我的代码似乎只适用于一本书,而不适用于多本书。 例如,我尝试在这里输入10本书的详细信息。 我只能搜索上一次创作的那本书 我的代码如下: class Book{ public String title,author; public int price; Book(String t,String a,int p){ t
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();
}
});
}
}
教材{
公共字符串标题、作者;
公共价格;
书本(字符串t、字符串a、整数p){
这个.title=t;
作者=a;
这个价格=p;
}
}
类Swingdemo实现ActionListener{
书B[]=新书[10];
JLabel-jl1;
JTextField a1、a2、a3、a4;
接线盒j1、j2、j3;
Swingdemo(){
JFrame jfrm=新JFrame(“欢迎”);
jfrm.setSize(180300);
jfrm.setLayout(新的FlowLayout());
jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);
a1=新的JTextField(8);
a2=新的JTextField(8);
a3=新的JTextField(8);
j1=新按钮(“创建”);
a4=新的JTextField(8);
j2=新的JButton(“搜索”);
jl1=新的JLabel(“按下按钮”);
j1.setActionCommand(“1”);
j2.setActionCommand(“2”);
j1.addActionListener(本);
j2.addActionListener(本);
jfrm.添加(a1);
jfrm.add(a2);
jfrm.添加(a3);
jfrm.add(j1);
jfrm.添加(a4);
jfrm.add(j2);
jfrm.add(jl1);
jfrm.setVisible(真);
}
int num=0;
已执行的公共无效行动(行动事件ae){
如果(ae.getActionCommand()等于(“1”)){
B[num]=新书(a1.getText(),a2.getText(),Integer.parseInt(a3.getText());
jl1.setText(“已添加账簿”);
num++;
}
否则{
int i;
对于(i=0;iboolean-found=false;
对于(i=0;i我更喜欢使用可选包装器,而不是像find这样的局部变量
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");
}
Optional mbyBook=Optional.empty();
(b:b册){
if(b.title.equals(a4.getText())){
mbyBook=可选的(b);
打破
}
}
if(mbyBook.isPresent()){
jl1.setText(String.format(“已找到%s本书”,mbyBook));
}否则{
jl1.setText(“未找到书”);
}
解决此类问题的方法是将其与所有不相关的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");
}
}
现在,该方法独立于Swing,您可以自己测试它
第一个问题是它不会编译。现在我们已经用return
返回了setText
s,编译器可以注意到在代码中有一条路径没有返回任何东西,其中所有if
都是false
因此,让我们通过在末尾添加一个返回来编译它。我们还将添加大括号{}
,以便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。在末尾i始终等于B.length,并且您始终编写“book was not found”。请注意,if(i==B.length)
条件总是匹配的,在代码的这个位置,i
总是等于B.length
。当发现条件时,你需要在if
条件中有一个中断
。摆脱从块中省略{}
的习惯。这会导致很难发现错误。演示如何使用equals()
请正确,我要质疑,书名是一本书的唯一标识符……很抱歉,我没有正确检查原始代码,没有可供比较的书籍实例……非常感谢您提供如此详细和出色的答案,我非常感谢:)
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");
}
}
jl1.setText(findBook(a4.getText());
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;
}
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");
}