Pregunta

He creado una lista enlazada, con inserción, buscar y quitar funciones. También creé un iterador para ello. Ahora, supongamos que yo hago esto:

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

Y listo, funciona (se imprime el valor del elemento en el nodo, en este caso 20). Ahora, si hago esto:

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

No lo hace, debido a que el iterador apunta a null. Aquí está la implementación de la función de búsqueda:

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

Así es como sé que hay algo raro con las comparaciones: Si cambio de parte del código por encima de la siguiente manera:

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

Lo puedo ver la impresión de los números de la lista. Imprime, en un momento dado, "20.1 20.1" (por ejemplo). Entonces, ¿cómo puedo solucionar este problema? La función parece ser correcto, pero parece como si Java no está comparando los números correctamente.

EDIT: wth, BigDecimal me dio el mismo tipo de problema también

.

EDIT 2: equals () trabajaron, no se dio cuenta otra cosa no iba bien. Lo sentimos.

¿Fue útil?

Solución

Usted no quiere que el operador! = Para esto. Se comapres referencias. Desea que el método .equals():

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

Además, cuidado con los de auto-boxing . Es posible que las cajas test.search(20.1) 20.1 a no es un Float un Double, lo que probablemente se romperá su comparación. Comparar los resultados con test.search(20.1d). Si no recuerdo mal, la expresión:

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

es falso.

Otros consejos

Tenga en cuenta que el uso de .equals() Comparar duplica puede dar lugar a errores. Double.equals() utiliza esto como su prueba de la igualdad:

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

Dobles y flotadores son aproximaciones de números almacenados en un espacio fijo en la memoria.

Con el fin de comparar adecuadamente números de punto flotante , es necesario tener en cuenta que debido a la naturaleza de los flotadores, habrá algún error.

Vea: http://www.google.com/search?q = flotante + punto + igualdad

Una forma rápida y fácil de comparar los dobles es utilizar Math.abs(a-b)<ACCEPTABLE_ERROR donde ACCEPTABLE_ERROR podría .000000000001 dependiendo de qué es exactamente lo que estás haciendo. (Nota esto no maneja casos extremos, tales como NaN y el infinito)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top