5

当比较从控制台输入获取的字符串与数组中的字符串时,false除非我添加.toString(). 两个字符串是相等的,它应该可以在不添加.toString(). 谁能帮我弄清楚为什么?

在这里,我得到了我想从控制台比较的字符串:

System.out.println("\nEnter the name you wish to remove from the list.");
String name = in.nextLine();
System.out.println("\n\"" + myNameList.remove(new MyOrderedList(name)) + "\"" + " removed from the name list\n");

这是删除方法:

public T remove(T element) {
    T result;
    int index = find(element);

    if (index == NOT_FOUND) {
        throw new ElementNotFoundException("list");
    }

    result = list[index];
    rear--;

    /** shift the appropriate elements */
    for (int scan = index; scan < rear; scan++) {
        list[scan] = list[scan+1];
    }

    list[rear] = null;
    return result;
}

这是问题所在的查找方法:

private int find(T target) {
    int scan = 0, result = NOT_FOUND;
    boolean found = false;

    if (!isEmpty()) {
        while (!found && scan < rear) {
            if (target.equals(list[scan])) { // Not sure why this does not work until I add the .toString()s
                found = true;
            }
            else {
                scan++;
            }
        }
    }

    if (found) {
        result = scan;
    }
    return result;
}

除非我将其if (target.equals(list[scan]))更改为.falseif (target.toString().equals(list[scan].toString())

我使用 anArrayList来表示列表的数组实现。列表的前面保留在数组索引 0 处。如果有帮助,可以扩展此类以创建特定类型的列表。如果需要,我可以发布所有课程。

4

3 回答 3

3

如果第一个参数是字符串,则仅使用 String.equals。

使用 .equals() 进行字符串比较不起作用 java

看来这是行之有效的事情。它的 T.equals() 不起作用。


如果你有这个工作,这意味着你已经toString()明智地覆盖了。

target.toString().equals(list[scan].toString()

但如果这不起作用

target.equals(list[scan])

这意味着您没有equals(Object)正确覆盖。

于 2012-09-17T13:29:54.343 回答
1

如果myNameList有一个String泛型参数,那么这将不起作用,因为 noString将等于MyOrderedList.

如果myNameList有一个MyOrderedList泛型参数,那么您需要确保equals()为它定义一个方法。

于 2012-09-17T13:30:20.077 回答
0

尼古拉斯和彼得是正确的。我需要覆盖 equals() 方法。我尝试了一些事情,还让 Eclipse 生成 hashCode() 和 equals() 来看看会发生什么以及它现在在没有 .toString() 的情况下工作

这是 Eclipse 为我生成的内容:

    /* (non-Javadoc)
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((myList == null) ? 0 : myList.hashCode());
    return result;
}

/* (non-Javadoc)
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (!(obj instanceof MyOrderedList)) {
        return false;
    }
    MyOrderedList other = (MyOrderedList) obj;
    if (myList == null) {
        if (other.myList != null) {
            return false;
        }
    } else if (!myList.equals(other.myList)) {
        return false;
    }
    return true;
}

我真的很感谢大家这么快的反应。我对java相当陌生,所以当我遇到问题时,我在这里阅读了很多帖子,我总是在这里找到答案。谢谢大家!

于 2012-09-17T16:41:21.113 回答