2012-01-03 79 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++; 
    } 
}