Java:For循环和If算法

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)

这有助于判断它是否是循环的结束,并且搜索已经结束,但搜索没有成功的结果.

我应该如何以面向对象的方式思考它?

总而言之,我的问题是,

  1. 是否有更好的方法来编写上面的代码而不是检查它是否是行的结尾?
  2. 有没有更好的方法来使用getName()方法或使用其他方法?

Pét*_*rök 6

您应该遍历数组并使用索引/布尔标志来存储是否找到该书.然后根据索引/标志值在最后打印消息.

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)设计中,几乎没有干净的"是/否"答案 - 而是在不同选项之间进行权衡,每个选项都有自己的优点和缺点.