Problem z equals()

0

Witam serdecznie
Trafiłem na następujący problem. Nie wiem dlaczego metoda findDate() w poniższej klasie zwraca mi losowe wyniki. Jeżeli wywołuję ją 10 razy pod rząd z identycznymi argumentami zwraca mi wyniki prawidłowe i nieprawidłowe w stosunku 50/50.

import java.util.GregorianCalendar;

public class StrangeCalendar{            
    
    private static GregorianCalendar[] dates;
    
    public StrangeCalendar(int days){
        dates = new GregorianCalendar[days];
        GregorianCalendar now = new GregorianCalendar();
        GregorianCalendar date;        
        for(int i = 0; i < dates.length; i++){
            date = new GregorianCalendar();
            date.set(now.get(now.YEAR), now.get(now.MONTH),
                    now.get(now.DATE) + i);
            dates[i] = date;
        }
    }
    
    public static int findDate(GregorianCalendar date){              
        for(int i = 0; i < dates.length; i++){            
            if(dates[i].equals(date)){
                return i;
            }
        }
        return -1;
    }
                
    public static void main(String[] args){
        StrangeCalendar sc = new StrangeCalendar(31);
        GregorianCalendar gc = new GregorianCalendar();
        gc.set(2008, 1, 6);
        System.out.println(Integer.toString(sc.findDate(gc)));
    }
}

Czy ktoś z was mógłby spróbować "ręcznie" uruchomić program 5-8 razy i napisać czy również ma różne wyniki?

0

Uruchomiłem około 30 razy. Błędny wynik (-1) miałem dwukrotnie (2 i 4 uruchomienie).
pozdrawiam

0

Uruchomiłem około 30 razy. Błędny wynik (-1) miałem dwukrotnie (2 i 4 uruchomienie).
pozdrawiam

A czy wiesz może dlaczego tak się dzieje? W jaki sposób zwiększyć skuteczność poprawnego wyniku do 100%?

0

Chyba wiem. Metoda equals() porównuje czas z dokładnością do milisekund.

        StrangeCalendar sc = new StrangeCalendar(31); //1
        GregorianCalendar gc = new GregorianCalendar(); //2

Milisekundy podczas wykonywania 1 mogą być inne niż podczas wykonywania 2.
pozdrawiam

0

Też mi się tak wydaje, ale z drugiej strony prawdopodobieństwo trafinia w tą samą milisekunę przy uruchamianiu programu jest minimalne. @bogdans, piszesz, że metoda zwróciła błędny wynik 2 razy na 30 wywołań, u mnie przed chwilą było to 16 razy na 30. Czy to oznacza, że metoda equals() nie nadaje się do porównywania danych typu GregorianCalendar z dokładnością do jednego dnia? W tym momencie zostaje mi tylko porównywanie String'ów, czy znacie może inne metody?

0

A nie możesz porównywać roku, miesiąca i dnia (zamiast obiektów typu GregorianCalendar) ?
pozdrawiam

0

To również jest sposób. Dziękuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1