2011-10-01 38 views
2

我正在构建简单的电话簿。因此,一个已经创建了一个类“人”:Vector.indexOf不适用于我的班级

public class Person implements Comparable<Person> { 
String Name; 
String number; 

public Person(String name,String Num) { 
    Name=name; 
    number=Num; 
} 

public String getNumber() { 
    return number; 
} 

public String getName() { 
    return Name; 
} 

@Override 
public int compareTo(Person another) { 
    return Name.compareTo(another.getName()); 
} 

@Override 
public String toString() { 
    return Name; 
} 

@Override 
public boolean equals(Object obj) { 
    if(!(obj instanceof Person) && !(obj instanceof String)) 
    { 
     return false; 
    } 
    else 
    { 
     if(obj instanceof Person) 
      return Name.toLowerCase().equals(((Person)obj).getName().toLowerCase()); 
     else 
      return Name.toLowerCase().equals(((String)obj).toLowerCase()); 
    } 

} 

@Override 
public int hashCode() { 
    return Name.hashCode(); 
} } 

在我创建一个矢量程序的其它部分,以“人”对象来填充它,但是当我试图寻找一个人使用vctPerson.indexOf("John") NAME我总是得到-1作为结果(未找到)。我的代码有什么问题?我已经实现了自定义的“等于”应该与字符串,并根据文档,“indexOf”使用“等于”比较对象...

编辑:我知道,我应该搜索后,电话号码,而不是名称但它无关这个例子

回答

2

什么Vector确实在indexOf

if (o.equals(elementData[i])) 

其中o"John"。所以你必须重写Sting.equals做正确的比较(只是开个玩笑)。或者你可以使用

vector.indexOf(new Person("John", null)); 

将打电话给你equals。严格地说,这将解决你的问题。

但是从长远来看,您不应该使用Vector,因为每个indexOf调用都会​​遍历列表 - 这不是非常有效。

更好的方法是MapHashMap您可以在其中存储键值对。如果这里有几个条目,使用密钥的查找比Vector.indexOf便宜得多。

Map<String, Person> map = new HashMap<String, Person>(); 
Person p = new Person("John", "1234"); 
map.put(p.getName().toLowerCase(), p); 

// loopup 
Person john = map.get("John".toLowerCase()); 
+0

但是,如果我想按姓名或电话号码对电话簿进行分类,该怎么办?:) – guest86

+1

然后两个'SortedMap'会更好:第一个包含所有(Name,Person)对,第二个包含(Number,Person)对。通过这种方式,您始终可以使用这两个键进行搜索,并且您可以使用任一排序方法打印列表,而无需手动排序。 'SortedMap'的合适实现是'TreeMap'。每个“TreeMap”需要一个“比较器”来决定排序顺序。 –

0

嗯,安全起见,你可以随时使用
1)Map<String,Person>让一个人,他的名字之间的关系
2)使自己的类,它扩展的java.util .Vector并覆盖它的indexOf方法
3)在你的equals方法中放置一个断点,看看indexOf被调用时发生了什么。
无论发生什么事情,最好不要依赖JDK文档中指定的indexOf的当前实现,因为它可能会在下一版本的JDK发布时发生变化:)

2

您打电话给我vctPerson.indexOf("John")。在这种情况下,Vector请致电"John".equals(vctPerson.get(indexValue)。等于String被调用,String的等于比较“John”和Person对象。

但是,当目标对象不是字符串的实例时,字符串的equals()不会返回true,"John".equals(vctPerson.get(indexValue)始终返回false。所以结果总是-1。因此,你不能使用vctPerson.indexOf("John")。如果你想使用矢量,你需要手动遍历矢量。

1

你平等被打破:你的对象可能等于A String(这就是你想利用什么),但没有String可能永远等于你反对。打破equals的对称性打破了一切。