Vlákno názorů k článku Novinky v JDK 7 (5) – projekt Lambda a anonymní funkce v příkladech od anonym - Trochu mě zarazilo, proč musí být při použití...

  • Článek je starý, nové názory již nelze přidávat.
  • 9. 12. 2010 7:58

    bez přezdívky

    Trochu mě zarazilo, proč musí být při použití Arrays.sort překryta metoda equals tak, aby vracela true pro compareTo(...) == 0. Pokud vím, compareTo je součástí interfacu Comparable a tedy při použití komparátoru toto nepoužiji. Nebo se mýlím? Předpokládám, že v komparátoru, který funkci Arrays.sort předávám, nepotřebuji metodu compareTo nebo equals. Od toho tuším komparátor je.

    Přiznámvám se ale, že v Javě natolik zběhlý nejsem, proto pokud je tam nějaký důvod, který nevidím, budu rád, když se jej dovím.

  • 9. 12. 2010 10:24

    Pavel Tišnovský
    Zlatý podporovatel

    Mate pravdu, v textu ma byt compare() nikoli compareTo(), omlouvam se za zmateni.

    Pri pouziti Arrays.sort() NEMUSI byt equals() prekryta, a to ani pri pouziti komparatoru ani v pripade, ze trida, jejiz instance se radi, implementuje rozhrani Comparable a tedy i metodu compareTo().

    Konkretne zde je implementace Arrays.sort() zavolana v pripade, ze se teto metode preda krome pole i komparator. Zadne equals() se zde nevola, pouze compare():

    private static void mergeSort(Object[] src,
                                  Object[] dest,
                                  int low, int high, int off,
                                  Comparator c) {
        int length = high - low;
    
        // Insertion sort on smallest arrays
        if (length < INSERTIONSORT_THRESHOLD) {
            for (int i=low; i<high; i++)
                for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
                    swap(dest, j, j-1);
            return;
        }
    
        // Recursively sort halves of dest into src
        int destLow  = low;
        int destHigh = high;
        low  += off;
        high += off;
        int mid = (low + high) >>> 1;
        mergeSort(dest, src, low, mid, -off, c);
        mergeSort(dest, src, mid, high, -off, c);
    
        // If list is already sorted, just copy from src to dest.  This is an
        // optimization that results in faster sorts for nearly ordered lists.
        if (c.compare(src[mid-1], src[mid]) <= 0) {
           System.arraycopy(src, low, dest, destLow, length);
           return;
        }
    
        // Merge sorted halves (now in src) into dest
        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
                dest[i] = src[p++];
            else
                dest[i] = src[q++];
        }
    }
  • 10. 12. 2010 21:57

    Maaartin (neregistrovaný)

    Ta metoda Comparator.equals je na zmateni nepritele, a tentokrat se to povedlo. Slouzi k porovnani dvou comparatoru a nema VUBEC nic spolecnyho s metodou compare.

    To ze je equals uvedeny v interfejsu Comparator nedava skoro zadny smysl, pridanou hodnotou (a to spornou) je pouze komentar k ni. Vzhledem k tomu ze equals je podedeny od Object, je Comparator stale (takovy divny) SAM interfejs.