Ben*_* C. 4 java algorithm loops if-statement
我从创建一个商店的任务中得到了这个问题,该商店使用Store.java和Book.java出租书籍.我已经完成了这项任务,但我很想知道特定部分的更好算法.
-
Book.java
public class Book {
private String name;
Book(String name)
this.name = name;
public String getName()
return name;
}
Run Code Online (Sandbox Code Playgroud)
Store.java
在main()内;
Book bookObj[] = new Book[3]; //Create 3 Array of Object.
bookObj[0] = new Book("Game Over");
bookObj[1] = new Book("Shrek");
bookObj[2] = new Book("Ghost");
Scanner console = new Scanner(System.in)
input = console.nextLine();
Run Code Online (Sandbox Code Playgroud)
假设,输入=恶魔.
现在,我需要进行简单的搜索以检查特定的书是否存在.
例:
for(int i = 0; i < bookObj.length; i++) {
if(bookObj[i].getName().equals(input))
System.out.println("Book Found!");
}
Run Code Online (Sandbox Code Playgroud)
显然,这是一个循环遍历对象数组并检查是否存在此Book的for循环.现在,当我想给出一个未找到Book的输出时,问题就出现了.
例:
for(int i = 0; i < bookObj.length; i++) {
if(bookObj[i].getName().equals(input))
System.out.println("Book Found!");
else
System.out.println("Book not Found!");
}
Run Code Online (Sandbox Code Playgroud)
上面代码的问题是Book Not Found会被打印三次.我的目标是避免这样的问题.我确实有这方面的解决方案,但我仍然在寻找一个更好的使用getName(),我认为仍有改进空间.
通常,在结构编程中,我会做以下事情,
for(int i = 0; i < bookObj.length; i++) {
if(bookObj[i].getName().equals(input))
System.out.println("Book Found!");
else if(i == bookObj.length - 1)
System.out.println("Book not Found!");
}
Run Code Online (Sandbox Code Playgroud)
这有助于判断它是否是循环的结束,并且搜索已经结束,但搜索没有成功的结果.
我应该如何以面向对象的方式思考它?
总而言之,我的问题是,
您应该遍历数组并使用索引/布尔标志来存储是否找到该书.然后根据索引/标志值在最后打印消息.
int foundAtIndex = -1;
for(int i = 0; i < bookObj.length; i++) {
if(bookObj[i].getName().equals(input)) {
foundAtIndex = i; // store the actual index for later use
break; // no need to search further
}
}
if(foundAtIndex >= 0)
System.out.println("Book Found!");
else
System.out.println("Book not Found!");
Run Code Online (Sandbox Code Playgroud)
或者(除非你的作业特别要求使用数组)你应该更喜欢a Set,它可以通过一次调用来搜索你contains().
我应该如何以面向对象的方式思考它?
在查看单个方法时,程序和OO样式之间没有太大区别.当尝试组织一系列与其相关的概念相关数据和方法时,差异开始出现在更高的层次上.
OO范例是将方法与它们操作的数据联系起来,并将它们封装到连贯的对象和类中.这些类最好是重要领域概念的表示.因此,对于您的书店,您可能希望将所有与书籍相关的代码放入您的Book班级.但是,上述搜索方法(以及它所运行的书籍集合)与任何特定的书籍实例无关,因此您有不同的选择:
Store(可能作为常规成员),或Book作为static成员.第一种选择更自然,所以我通常更喜欢这样.但是,在特定情况下,第二种选择可能更可取.在(OO)设计中,几乎没有干净的"是/否"答案 - 而是在不同选项之间进行权衡,每个选项都有自己的优点和缺点.