2012-09-17 118 views
4

将控制台输入的字符串与数组中的字符串进行比较时,除非添加.toString(),否则始终为false。两个字符串都是相同的,它应该在不添加.toString()的情况下工作。任何人都可以帮我弄清楚为什么?使用.equals()的字符串比较在Java中不起作用。

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

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"); 

这里是remove方法:

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]))总是返回false除非我将其更改为if (target.toString().equals(list[scan].toString())

我正在使用ArrayList来表示一个列表的数组实现。列表的前面保存在索引为0的数组中。如果有帮助,此类将扩展为创建特定种类的列表。如有需要,我可以发布所有课程。

+2

'list'的定义在哪里? –

+0

我认为这是由于泛型 - 看看'目标'变量 - 它真的是字符串的实例吗?尝试实现自己的equals()并跟踪它... – shmoula

+1

不要以为你不能使用它,它已经坏掉了。如果String上的.equals()被破坏,那将是众所周知的。 –

回答

1

如果myNameList具有String泛型参数,那么这将不起作用,因为没有String将等于MyOrderedList的类型。

如果myNameList有一个MyOrderedList通用参数,那么您将需要确保您为其定义equals()方法。

3

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

字符串比较不工作的Java

看来这是不工作的事情。它的T.equals()不起作用。


如果你有这个工作,这意味着你明智地重写了toString()

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

,但如果这行不通

target.equals(list[scan]) 

这意味着你没有正确重写equals(Object)

+1

你对我们做的不公平! 你回答所有的问题之前,我们甚至可以想到答案 – Yadnesh

+0

确实是一个最严重的不公正:) –

+1

@Yadnesh好的,好的,我会给它休息。 ;) –

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相当陌生,所以当我遇到问题时,我在这里阅读了很多帖子,我总是在这里找到答案。感谢大家!