2012-01-03 109 views
2

我目前有3個類,一個包含GUI的主類,其中我調用此方法,一個包含數據的客戶類和一個收集客戶類數據的customerList類,到數組列表中,並且還包含搜索數組列表方法。正在搜索一個ArrayList

我想實現一個搜索方法,可以從我的主要類在一個動作事件處理程序中調用。我有幾個問題,但。每當我運行該方法時,「System.out.println(customer.returnFamilyName());」行總是顯示我的數組列表中的第一個familyname。

不要猶豫,要了解更多信息,我不知道我已經解釋了這一點。

這裏是我的方法:

public void searchCustomer(String familyName) { 
    int index = 0; 
    boolean found = false; 
    customer customer; 
    while(index < CustomerList.size() && !found) { 
     customer = CustomerList.get(index); 
     if(customer.returnFamilyName().equalsIgnoreCase(familyName)) { 
      found = true; 
      break; 
     } 
     if(found == true) { 
      ; 
     } 
     System.out.println(customer.returnFamilyName()); 
     index++; 
     return; 
    } 
} 

回答

0

你永遠不會增加索引。

的代碼應該是:

public void searchCustomer(String familyName) { 
    for (customer customer : CustomerList) { 
     if (customer.returnFamilyName().equalsIgnoreCase(familyName)) { 
      System.out.println(customer.returnFamilyName()); 
      break; 
     } 
    } 
} 

此外,「客戶」類應該被稱爲「客戶」類名稱應該以大寫字母開頭,「returnFamilyName」應該是「getFamilyName」通過訪問方法約定被命名爲'get'+字段名稱,'CustomerList'應該是'customerList',因爲字段名稱應該以小寫字母開頭。

+0

謝謝你,關於重命名我的類和方法,我早些時候讀過關於這個地方的內容,一旦我寫完我的課程,我一定會這樣做。 – user1080390 2012-01-03 21:34:48

+0

爲什麼你在這一點上打擾布爾值?如果你找到了你要找的東西,你可以明確地將它輸出到終端,然後從增強的for循環中斷開,然後再斷開整個方法。 – Makoto 2012-01-03 21:39:55

+0

@Makoto,謝謝。我修復了我的代碼。原始代碼的所有其他問題都失去了這個錯誤。 – 2012-01-03 21:55:52

2

這不是從你的問題是什麼意圖behaivor實際上清楚。除此之外,這是什麼?

if (found == true); 

想必你的意思是:

if (found) { 
    System.out.println... 
} 

但如果相同的姓氏在列表中出現兩次呢?此外,爲什麼不使用Map而不是List?查詢將被去O(n)O(1)

2

下降的;if (found == true);因爲讀作:if this condition is true, do notihng和使用大括號總是:

if (found == true) { 
    System.out.println(customer.returnFamilyName()); 
} 

此外,包括while循環內的增量,否則你是不是真的迭代任何東西。

此代碼似乎工作,因爲你的第一個元素碰巧與搜索到的元素重合,嘗試與另一個元素,你會最終在一個無限循環。

public void searchCustomer(String familyName) { 

    for (customer current : CustomerList) {   
     if (current.returnFamilyName().equalsIgnoreCase(familyName)) { 
      System.out.println(current.returnFamilyName()); 
      break; 
     } 
    } 
} 

一些補充說明:

一個版本是這樣嘗試

在Java clases應以大寫字母開始,所以類名應被聲明爲Customer代替customer和變量開始小寫,因此CustomerList應該是customerList。方法可避免return一部分,並與一個get

也可命名爲,搜索方法應該更好地返回找到的值,而不是打印出來的,所以你的最終版本看起來是這樣的:

public Customer searchCustomer(String familyName) { 
    for (Customer current : customerList) { 
     if (current.getFamilyName().equalsIgnoreCase(familyName)) { 
      return current; 
     } 
    } 
    return null; 
} 
0

我會建議試試這個:

System.out.println(customer.returnFamilyName()); 
       index++; 
if(found == true) { return;} 
-1

不要忘記增加while循環或它有可能無限期地運行。

您可以選擇使用所謂的"enhanced for-loop",它允許您完全避免在CustomerList之上遞增值。你有一個對象customer,所以我們可以使用如下:

for (customer cus: CustomerList) { 
    if(cus.returnFamilyName().equalsIgnoreCase(familyName)) { 
     System.out.println(cus.returnFamilyName()); 
     return; 
    } 
} 

如果你選擇堅持你原來的代碼(這是罰款),然後觀察在下面代碼的變化。

while(index < CustomerList.size()) { 
    customer = CustomerList.get(index); 
    if (customer.returnFamilyName().equalsIgnoreCase(familyName)) { 
     System.out.println(customer.returnFamilyName()); 
     break; 
    } else { 
     index++; 
    } 
}