Java는 복식을 올바르게 비교하지 않는 것 같습니다
문제
삽입, 검색 및 제거 기능으로 링크 된 목록을 만들었습니다. 또한 반복자를 만들었습니다. 이제 내가 이것을한다고 가정 해 봅시다 :
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와 같은 에지 케이스를 처리하지 않습니다)