2012-09-17 4 views
4

콘솔 입력에서 가져온 문자열과 배열 내부의 문자열을 비교할 때 .toString()을 추가하지 않으면 항상 false이됩니다. 두 문자열은 동등하므로 .toString()을 추가하지 않으면 작동합니다. 아무도 내가 왜 알아낼 수 있습니까? 여기.equals()를 사용한 문자열 비교는 Java에서 작동하지 않습니다.

내가 콘솔에서 비교하려는 문자열을 얻을 : 여기

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; 
} 

문제였다됩니다 찾기 방법입니다 : 여기

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

은 제거 방법이다

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

제네릭 때문인 것 같아요. 'target'변수를 봐주세요. 정말로 String의 인스턴스입니까? 자신의 equals()를 구현하고 추적 해보십시오. – shmoula

+1

사용할 수 없기 때문에 깨졌습니다. String의 .equals()가 깨진 경우 꽤 잘 알려져 있습니다. –

답변

1

String 제네릭 매개 변수가있는 경우 StringMyOrderedList과 같지 않으므로 작동하지 않습니다.

MyOrderedList 제네릭 매개 변수가있는 경우 equals() 메서드를 정의해야합니다.

3

첫 번째 인수가 String 인 경우 String.equals 만 사용합니다. .equals를 사용

문자열 비교() 자바이 작업을 수행하는 일이 나타납니다

작동하지 않습니다. 그것의 T.equals()는 작동하지 않습니다. 이 작업이있는 경우


는, 당신이 현명 toString()를 오버라이드 (override) 한 것을 의미한다.

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

하지만,이 경우

은 당신이 제대로 equals(Object)를 오버라이드 (override)되지 않는 것을 의미

target.equals(list[scan]) 

작동하지 않습니다.

+1

당신은 우리에게 불의를하고 있습니다 !! 우리는 심지어 대답을 생각할 수 있기 전에 모든 질문에 답합니다. – Yadnesh

+0

참으로 가장 비참한 불의입니다. –

+1

@Yadnesh ok, ok, 나는 그것을 깨뜨릴 것입니다. ;) –

0

니콜라스와 피터가 정확합니다. equals() 메서드를 재정의해야했습니다. 나는 몇 가지를 시도하고도 (이클립스의 해시 코드를 생성 할 수 있습니다) 및 일어날 것입니다 무엇을보고) (동일 자사로 .toString()

다음

이클립스 나를 위해 생성 된 것입니다없이 지금 작업 :

/* (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; 
} 

빠른 답변을 보내 주신 모든 분들께 진심으로 감사드립니다. 나는 상당히 새로운 자바에 그래서 내가 여기에 게시물을 많이 읽을 때 문제가 나는 항상 대답을 찾을 수 있습니다. 모두에게 감사드립니다!

관련 문제