面向对象的帮助〜搜索

时间:2014-11-21 21:35:05

标签: java

我是OO的新手。我刚开始用Java编写大学课程。

我有一个问题: 我在俱乐部课程中有一种方法可以根据我的工作表搜索会员的姓名(或姓名的一部分)。 我有一个测试这个的课程,我不必手动创建Club类中的对象(我使用BlueJ)。

这是搜索方法:

public void searchMember(String name){
    i=0;
    found = false;

    while( i < members.size() && !found ){
        if(members.contains( name )){
            found = true;
        }else{
            i++;
        }
    }

    if(found == true){
        System.out.println(members.get(i));
    }else{
        System.out.println("Och Naw ... Member not found.");
    }
}

这是测试类代码:

public void demo()
{
    club = new Club();
    club.join(new Membership("Gordy Broon", 1, 1972));
    club.join(new Membership("Eck Salmon", 9, 1965));
    club.join(new Membership("Davie Caramel", 5, 1960));

   System.out.println("Now doing some searching: ");
   club.searchMember( "mon" );
   System.out.println(" ");

   System.out.println("And some more searching: ");
   club.searchMember("moon");
   System.out.println(" ");
}

有人可以向我解释为什么在搜索&#34; mon&#34;结果没找到?

根据我的理解,这应该有用。

我很新,所以任何帮助和解释都会很棒^ _ ^ 谢谢!

2 个答案:

答案 0 :(得分:1)

您正在将String与成员资格进行比较。 contains的{​​{1}}方法将遍历列表中的每个项目并检查List,但"mon".equals(membership)对象是否可能永远不会返回true,它等于某些字符串

(我假设你的Membership课程,你没有从Membership覆盖equals方法。可以覆盖java.lang.Object以便与 返回true,但有两个问题。一,当你相等时,你不仅期望一个匹配,而是一个子串匹配(其中“mon”匹配“Eck Salmon”) “)和两个,以这种方式实施equals将违反其合同。预计如果equals然后a.equals(b),但没有b.equals(a)对象永远存在返回true表示它等于您的java.lang.String个对象之一,并且您无法修改Membership以使其执行此操作。)

您要做的是浏览列表并检查是否有任何成员资格对象的名称包含“mon”。我假设您的Membership对象有一个java.lang.String方法:

getName()

在Java 8中可以更简洁地执行此操作:

for (Membership membership : members) {
    if (membership.getName().contains(name)) {
        System.out.println(membership);
        return;
    }
}
System.out.println("Och Naw ... Member not found.");

这将查找列表中与名称必须包含指定名称的条件匹配的第一项,然后使用其Optional<Membership> maybeMember = membership.stream() .filter(m -> m.getName().contains(name)).findFirst(); String result = maybeMember.map(m -> m.toString()) .orElse("Och Naw ... Member not found."); System.out.println(result); 方法将其映射到字符串,否则如果没有匹配项则使用默认字符串从列表中找到了。

答案 1 :(得分:0)

似乎成员是一个列表。所以,当你执行members.contains(name)时,它不会工作。您需要执行以下成员.get(i).getName()。contains(name)。