簡體   English   中英

ArrayList搜索總是返回最后一個對象

[英]ArrayList search always returns last object

我正在嘗試創建一個程序來存儲聯系信息並具有搜索功能。 但是,無論我進行什么搜索,它總是返回添加到ArrayList的最后一個對象。 我認為這與for循環有關,但我不確定。 我對編寫代碼非常陌生,任何輸入都值得贊賞。

這是我的搜索方法:

    public void searchContacts()
{
    Scanner stdIn = new Scanner (System.in);
    System.out.println("Search Menu;\n1. First Name\n2. Last Name\n3. Street Address\n4. City, State\n5. Zip Code\n");
    System.out.println("Please Enter Field to Search: ");
    search = stdIn.nextInt();
    Scanner stdIn1 = new Scanner (System.in);
    System.out.println("Please enter value to search for: ");
    value = stdIn1.nextLine();

    switch (search)
    {
        case 1:
            for(int i=0; i<addressBook.size();i++)
            {   
                if(value.equals(addressBook.get(i).getFirstName()));
                {
                indexFound = i;
                }                   
            }
            break;
        case 2:
            for(int i=0; i<addressBook.size();i++)
            {
                if(value.equalsIgnoreCase(addressBook.get(i).getLastName()));
                {
                indexFound = i;
                }
            }
            break;
        case 3:
            for(int i=0; i<addressBook.size();i++)
            {
                if(value.equalsIgnoreCase(addressBook.get(i).getStreetAddress()));
                {
                indexFound = i;
                }
            }
            break;
        case 4:
            for(int i=0; i<addressBook.size();i++)
            {
                if(value.equalsIgnoreCase(addressBook.get(i).getCityState()));
                {
                indexFound = i;
                }
            }
            break;
        case 5:
            for(int i=0; i<addressBook.size();i++)
            {
                if(value.equalsIgnoreCase(addressBook.get(i).getZipCode()));
                {
                indexFound = i;
                }
            }
            break;
        default:
            indexFound = -1;
    }       
}

如果需要的話,這里是我的顯示方法:

public void display()
{
    System.out.println();
    if (indexFound > -1)
    {
    System.out.println("First Name: " + addressBook.get(indexFound).getFirstName());
    System.out.println("Last Name: " + addressBook.get(indexFound).getLastName());
    System.out.println("Street Address: " + addressBook.get(indexFound).getStreetAddress());
    System.out.println("City, State: " + addressBook.get(indexFound).getCityState());
    System.out.println("Zip Code: " + addressBook.get(indexFound).getZipCode());
    }        
    else
    System.out.println("No Entry Found");

}

接觸類

public class Contact 
{
private String firstName;
private String lastName;
private String streetAddress;
private String cityState;
private String zipCode;

public Contact (String first, String last, String street, String cS, String zip)
{
    firstName = first;
    lastName = last;
    streetAddress = street;
    cityState = cS;
    zipCode = zip;
}

public String getFirstName() 
{
    return firstName;
}

public String getLastName() 
{
    return lastName;
}

public String getStreetAddress() 
{
    return streetAddress;
}

public String getCityState() 
{
    return cityState;
}

public String getZipCode() 
{
    return zipCode;
}



}

找到第一個元素后,您應該休息一下。

if(value.equals(addressBook.get(i).getFirstName()));
            {
              indexFound = i;
              break;
            } 

問題是您的每個if語句后都直接跟一個分號:

if (value.equals(addressBook.get(i).getFirstName())); // HERE is the problem - the semicolon

...字面解釋為“如果找到,什么也不做”。 在評估了if語句之后,它始終總是跳入以下代碼塊:

{
    indexFound = i;
}

因此,如果您刪除了if語句之后的所有分號,並在設置indexFound之后立即從方法中return ,則應該沒問題。

該代碼看起來類似於此-不幸的是,我現在無法測試此代碼...

switch (search)
{
    case 1:
        for (int i=0; i<addressBook.size(); i++)
        {   
            if(value.equals(addressBook.get(i).getFirstName()))
            {
                indexFound = i;
                return;
            }                   
        }
        break;
    case 2:
    // etc.

成功匹配后循環就不會中斷。 循環直到最后一個索引。

根據以下代碼段進行更改:

        for(int i=0; i<addressBook.size();i++)
        {
            if(value.equalsIgnoreCase(addressBook.get(i).getZipCode()));
            {
            indexFound = i;
            break;
            }
        }
        break;

根據您的要求,應將其重寫如下:

indexFound=-1;
for(int i=0; i<addressBook.size() && indexFound==-1 ;i++){
    switch (search)
    {
        case 1:
               if(value.equals(addressBook.get(i).getFirstName()));
                 indexFound = i;
               break;
        case 2:
               if(value.equalsIgnoreCase(addressBook.get(i).getLastName()));
                indexFound = i;
               break;
        case 3:
              if(value.equalsIgnoreCase(addressBook.get(i).getStreetAddress()));
                indexFound = i;
              break;
        case 4:
             if(value.equalsIgnoreCase(addressBook.get(i).getCityState()));
                indexFound = i;
              break;
        case 5:
                if(value.equalsIgnoreCase(addressBook.get(i).getZipCode()));
                indexFound = i;
              break;
        default:
            indexFound = -1;
    }  
}

在每種情況下的每種if條件中均應有一個break語句。 對於特定的代碼,應該像這樣...

case 1:
        for(int i=0; i<addressBook.size();i++)
        {   
            if(value.equals(addressBook.get(i).getFirstName()));
            {
            indexFound = i;
            break;
            }                   
        }
        break;

在每種情況下都應實施。

暫無
暫無

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

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