2013-03-03 4 views
12

Sto provando a creare un comparatore che possa prendere qualsiasi tipo di elemento da confrontare. Non sono sicuro su come creare la classe. Voglio solo che metta a confronto due elementi dello stesso tipo (ma qualunque sia il tipo assegnato dal client, es: Integer, String, Double, ecc ...) per vedere quale è maggiore dell'altro.Creazione di una classe di confronto generica

public class InsertionComparator implements Comparator<T> 
{ 
/** 
* Compares two elements. 
* 
* @param f1 The first element you want to compare. 
* @param f2 The second element you want to compare. 
* @return -1,0,1 Whether or not one is greater than, less than, 
* or equal to one another. 
*/ 
public int compare(<T> element1,<T> element2) 
{ 
    if(element1 < element2) 
    { 
     return -1; 
    } 
    else 
    { 
     if(element1 > element2) 
     { 
      return 1; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
} 
} 

Si prega di aiutare, grazie!

+0

Per i principianti, si verificano diversi errori di sintassi. Prova a leggere l'articolo [Generics in Java] (http://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf). Ti permetterà di risolvere questo e tutti i seguenti problemi da solo, poiché spiega cosa generici e come usarli abbastanza bene. –

+0

Per cosa ti serve esattamente? Sento che questo non è il tuo vero problema. –

+0

Questo è per i dati inseriti dall'utente, come solo numeri, date e lettere? Un comparatore può essere usato per qualsiasi classe Java come confrontare una finestra con un'altra, quindi la tua domanda sembra un po 'ampia come lo è ora, per favore specifica. – Geronimo

risposta

21

La cosa più vicina si può fare per questo è un Comparator che può confrontare tutti gli oggetti che implementano l'interfaccia Comparable:

class NaturalComparator<T extends Comparable<T>> implements Comparator<T> { 
    public int compare(T a, T b) { 
    return a.compareTo(b); 
    } 
} 

questo è davvero il più vicino si può fare: solo Comparable oggetti hanno la "ordinamento naturale" stai cercando di modellare qui. Ma in generale, una volta che hai Comparable oggetti, non necessariamente hanno bisogno di un Comparator: per esempio, Collections.sort può prendere un List con un Comparator, o un List con Comparable elementi.

+0

Un modo pratico, anche se subdolo, per ottenere un comparatore di ordine naturale: 'Collections.reverseOrder (Collections.reverseOrder());' – VGR

+4

per risultati ottimali, usare 'T extends Comparable ' – newacct

5
  1. Non è possibile scrivere un unico comparatore per tutto senza alcune ipotesi su quali saranno i tipi. Cosa fai con le lezioni personalizzate? Come puoi decidere quale è maggiore dell'altra? Per più classi in natura, un comparatore non ha senso.

  2. D'altra parte, se ti limitare a String, Integer, Double, poi sono paragonabili e si può semplicemente scrivere il comparatore con il compareTo() Metodo:

    public int compare(T element1,T element2) 
    { 
        return element1.compareTo(element2); 
    } 
    

ma quindi useresti semplicemente l'ordine naturale degli elementi e ciò annullerebbe lo scopo dell'utilizzo di un comparatore. Di solito non ne hai bisogno in questi casi.

0

Non so se questo è necessariamente utile, ma non è impossibile implementare un comparatore generico significativo.

Grazie all'interfaccia di riflessione, è possibile, ad esempio, ordinare gli oggetti in base al loro nome di classe. O forse anche in qualche modo dalla loro gerarchia di classe. I bambini dopo i genitori, per esempio.

Oppure è possibile ordinarli in base a ciò che produce il loro metodo toString(). O hashCode(). Ogni oggetto li ha, dopotutto.

Qualunque cosa tu faccia, ricorda di considerare che entrambi gli elementi potrebbero essere nulli.

... Penso che abbiamo bisogno di sapere per cosa serve questo comparatore generico.