문제

삽입, 검색 및 제거 기능으로 링크 된 목록을 만들었습니다. 또한 반복자를 만들었습니다. 이제 내가 이것을한다고 가정 해 봅시다 :

myList<Integer> test = new myList();
test.insert(30);
test.insert(20);
test.insert(10);
myList.iterator it = test.search(20);
if(it.hasNext())
    System.out.println(it.next());

그리고 Voila는 작동합니다 (이 경우 노드에서 요소의 값,이 경우 20). 이제 내가 이것을한다면 :

myList<Double> test = new myList();
test.insert(30.1);
test.insert(20.1);
test.insert(10.1);
myList.iterator it = test.search(20.1);
if(it.hasNext())
    System.out.println(it.next());

반복자가 null을 가리키기 때문에 그렇지 않습니다. 검색 기능의 구현은 다음과 같습니다.

public iterator search(T data)
{
    no<T> temp = first;
    while( (temp != null) && (temp.data != data) )
        temp = temp.next;
    return (new iterator(temp));
}

다음은 비교에 비린이 많은 것을 아는 방법입니다. 위의 코드의 일부를 다음과 같이 변경하면 다음과 같습니다.

while( (temp != null) && (temp.data != data) )
     System.out.println(temp.data + " " + data);
     temp = temp.next;

목록에서 숫자를 인쇄하는 것을 볼 수 있습니다. 한 시점에서 "20.1 20.1"(예 :) 인쇄. 그래서 어떻게 해결할 수 있습니까? 함수는 옳은 것처럼 보이지만 Java가 숫자를 올바르게 비교하지 않는 것처럼 보입니다.

편집 : wth, bigdecimal도 나에게도 같은 종류의 문제를 주었다.

편집 2 : Equals ()가 작동했으며 다른 것이 잘못되었다는 것을 몰랐습니다. 죄송합니다.

도움이 되었습니까?

해결책

당신은 이것을 위해! = 연산자를 원하지 않습니다. 그것은 comapres 참조입니다. 당신은 원합니다 .equals() 방법:

public iterator search(T data)
{
    no<T> temp = first;
    while (!data.equals(temp.data)) {
        temp = temp.next;
    }
    return (new iterator(temp));
}

또한 조심하십시오 자동 박스. 당신은 그것을 찾을 수 있습니다 test.search(20.1) 상자 20.1 ~ a Float 아니에요 Double, 아마도 당신의 비교를 깨뜨릴 것입니다. 결과를와 비교하십시오 test.search(20.1d). 내가 올바르게 기억한다면, 표현 :

new Float(20.1).equals(new Double(20.1))

거짓입니다.

다른 팁

사용하십시오 .equals() 비교하기 위해서 더블스 오류로 이어질 수 있습니다. Double.equals() 이것을 평등 테스트로 사용합니다.

 d1.doubleValue() == d2.doubleValue()

더블스 그리고 부유물 ~이다 근사치 메모리의 고정 된 공간에 저장된 숫자.

올바르게 비교하기 위해 부동 소수점 번호, 플로트의 특성으로 인해 약간의 오류가있을 것입니다.

보다: http://www.google.com/search?q=floating+point+ equality

복식을 비교하는 빠르고 쉬운 방법은 사용하는 것입니다. Math.abs(a-b)<ACCEPTABLE_ERROR수용 가능한 곳 .000000000001 정확히 무엇을하고 있는지에 따라.(이것은 NAN 및 Infinity와 같은 에지 케이스를 처리하지 않습니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top