簡體   English   中英

Java:如何在數組列表中搜索數組中對象的實例變量

[英]Java: How to search an arraylist for a instance variable of an object in the array

下面的一段代碼讓我非常頭疼。 它只做我想要它做的事情,即獲取輸入的字符串,然后通過對象的分類(字符串)搜索書對象的數組列表,然后返回該書對象。 目前,只要輸入分類是列表中書籍的實際分類,下面的代碼就可以工作。 例如,找到了 TD999,因此將其返回。 但是,如果我為該類鍵入一堆廢話,例如 yhgfsdsfbv,它仍然返回一本書,例如 TD345(似乎它變成了一本最初歸類為 null 然后在程序運行時使用 setClassification 方法歸類的書。

public Book searchClass(String inputClass){
    Book foundBook = null;
    for(Book findClass : bookStore){
        if(findClass.getClassification()!=null &&
 findClass.getClassification().equalsIgnoreCase(givenClass)) 
        return findClass;
            foundBook = findClass;
    }
    return foundBook;
}

我試圖修復它是這樣的:

public Book searchClass(String inputClass) throws IllegalArgumentException{

    Book foundBook = null;
    for(Book findClass : bookStore){
        if(!(findClass.getClassification().equalsIgnoreCase(inputClass))){
                   throws new IllegalArgumentException("book not found")
        }
        else if(findClass.getClassification().equalsIgnoreCase(inputClass)){
            foundBook = findClass;
        }
    }
    return foundBook;
}

但是,即使我正確輸入了列表中的分類,這也會每次都拋出異常。

我不知道如何解決這個問題來做我想做的事,我已經厭倦了很多其他的方式,從來沒有正常工作過。 我已經通讀了我所有的講義、幾本教科書和 oracle 網頁,但不知道是什么導致了問題,因此我無法修復它。

讓我們開始你的第一次嘗試。 如果您找到一本書,請立即歸還。 因此,如果你在整個循環中沒有找到任何東西,你應該發出失敗信號:返回空值,或者拋出異常。 返回foundBook是沒有意義的,因為你知道你沒有找到任何東西。

這意味着根本不需要foundBook變量。

public Book searchClass(String inputClass) {
    for (Book book: bookStore) {
        if (book.getClassification() != null &&
            book.getClassification().equalsIgnoreCase(inputClass))
        {
            return book;
        }
    }

    throw new IllegalArgumentException("book not found");
}

另一種編寫它的方法是使用 Java 8 流。 您可以讓流處理循環,而不是顯式循環。

public Book searchClass(String inputClass) {
    return bookStore.stream()
        .filter(book -> book.getClassification() != null)
        .filter(book -> book.getClassification().equalsIgnoreCase(inputClass))
        .findAny()
        .orElseThrow(() -> new IllegalArgumentException("book not found"));
}

問題是,在這里:

public Book searchClass(String inputClass){
    if(findClass.getClassification()!=null && findClass.getClassification().equalsIgnoreCase(givenClass)) 
    return findClass;
        foundBook = findClass;
}

如果 if 條件為真,則返回書,否則,如果條件不為真,則將foundbook設置為findclass

然后,最后,您返回foundbook ,即使沒有匹配的書,它也將始終返回

你必須這樣做:

for(Book findClass : bookStore){
    if(findClass.getClassification()!=null && findClass.getClassification().equalsIgnoreCase(givenClass)) 
    return findClass; //return the book
}
return null; // if no book was found, then return null.

我將嘗試對代碼進行解釋,請閱讀評論並修復您自己的評論,以便讓您學習有用,我希望。

public Book searchClass(String inputClass) throws IllegalArgumentException{

    Book foundBook = null;
    for(Book findClass : bookStore){
       // if(!(findClass.getClassification().equalsIgnoreCase(inputClass))){
         //          throws new IllegalArgumentException("book not found")
        //}//remove these because each loop checks that 
        if(findClass.getClassification().equalsIgnoreCase(inputClass)){
            foundBook = findClass; // return findClass; // you do not need any more iteration you found it.
        }
    }
    return foundBook; //if you are here that means no match throw exception //throws new IllegalArgumentException("book not found")


}
public static int personThereAlready(String name, ArrayList<Person> people) {
    int index = -1;
    for(int i=0; i < people.size();i++) {
        Person person = people.get(i);
            
        if (person.getName().equalsIgnoreCase(name)) {
            index = i;
            break;
        }
    }
    return index;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM