|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Vicenza
Messaggi: 3949
|
[JAVA]Implementare Comparator
Allora, mettiamo che io abbia un metodo così definito:
public static <E> void pincoPallo(E[] a, Comparator<E> c) { ...... } inserito in una classe Prova.java insieme al main. Ora, io nel main devo testare il metodo pincoPallo con un array di double, ma non so cosa passare come secondo parametro del metodo... ho provato con: import java.util.Comparator; public class Prova implements Comparator dovrei scrivere il metodo compare(Object a, Object b) definito nell'interfaccia Comparator, ma se io ho un array di double, come fo? Insomma, ho un pò di confusione, c'è qualcuno che mi puà dare una dritta? Grazie
__________________
CASE Haf X MOBO Asrock Extreme4 CPU i5 2500K cooled By Thermalright Archon VGA Sapphire 6950 2GB RAM G.Skill Ripjaws-X F3 4GB 1333mhz PSU Enermax 500W modu 87+ HDD C300 64GB - f3 1TB - AAKS 500GB MONITOR Dell U2311H | Trattative completate Ultima modifica di 3vi : 18-12-2008 alle 12:23. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
A occhio il metodo "pincoPallo" prende in ingresso un array di oggetti di qualsiasi tipo (il tipo è parametrizzato) e un Comparator definito per oggetti dello stesso tipo.
Se ne deduce che pincoPallo al suo interno utilizza il Comparator su ogni oggetto dell'array passatogli, probabilmente per trovare i primi due oggetti che sono identici? Questo mi viene da pensare dato che il metodo torna un oggetto dello stesso tipo parametrizzato di quelli passati in ingresso. Il compito di un Comparator, definito per un tipo ben preciso di ogetti, sarebbe quello di confrontare due oggetti dello stesso tipo per vedere se sono identici o meno (in cosa consiste l'identità tra due oggetti dello stesso tipo lo decide chi implementa il tipo). Nel tuo caso che passi un array di double (forse Double?) il confronto lo farei in base al valore: se due oggetti passati in ingresso al metodo compare() hanno lo stesso valore torno true, altrimenti false. @EDIT: Scusa mi correggo: hai ragione, Comparator serve per distinguere quale tra i due oggetti che compara è il "maggiore" e quale il "minore", non per verificare la loro euguaglianza (mi son confuso con equals(), sorry).
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 18-12-2008 alle 13:50. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Vicenza
Messaggi: 3949
|
Quote:
dovrei fare una cosa tipo DoubleComparator c = new DoubleComparator() e poi pincoPallo(a[], c) dove a è un array di Double, però non riesco a capire come fare questo passaggio
__________________
CASE Haf X MOBO Asrock Extreme4 CPU i5 2500K cooled By Thermalright Archon VGA Sapphire 6950 2GB RAM G.Skill Ripjaws-X F3 4GB 1333mhz PSU Enermax 500W modu 87+ HDD C300 64GB - f3 1TB - AAKS 500GB MONITOR Dell U2311H | Trattative completate |
|
|
|
|
|
|
#4 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 22006
|
Quote:
altrimenti se devi ordinare array di dati di un tipo definito da te devi fare un override del metodo Comparator poi dopo ti basta usare una collection e usare il metodo sort della collection o almeno così mi pare non uso java da anni
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Comparator è un'interfaccia; dovresti dunque scriverti un'implementazione per il tipo che ti interessa.
Siccome devi comparare double dovresti scrivere un Comparator per il tipo specifico: ma dato che non puoi usare un tipo primitivo come tipo parametrico devi usare il tipo Double. Codice:
class DoubleComparator<Double> implements Comparator
{
// implementazione interfaccia java.util.Comparator
}
Codice:
// mi creo un array di double
double[] primitives = new double[5];
for(int i = 0; i < primitives.length; i++)
primitives[i] = i+1;
// chiamo pincoPallo, passandogli l'array e un'istanza del Comparator adatto
Double result = pincoPallo(primitives, new DoubleComparator());
@fazz!: Giuste osservazioni le tue, ma credo che l'utente debba svolgere un esercizio che gli impone di fare così, probabilmente ha lo scopo di fargli implementare un Comparator con tipo parametrizzato, e deve gestire il fatto che il tipo primitivoo double non può essere usato per tipizzare l'implementazione del Comparator, ma deve usare appunto la classe Double. P.S: occhio che mi sono accorto adesso che il metodo pincoPallo vuole un E[] come array quindi devi sostituire l'array di double con un array di Double[].
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 18-12-2008 alle 14:08. |
|
|
|
|
|
#6 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 22006
|
Quote:
ah ecco svelato l'arcano, mi pareva troppo semplice
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Vicenza
Messaggi: 3949
|
ok, provo a riassumere
![]() Creo l'interfaccia DoubleComparator che implementa Comparator; Nella mia classe, dov'è definito il metodo che riceve un array generico, estendo la classe DoubleComparator, creo l'oggetto cm con new DoubleComparator() e lo passo al metodo pincoPallo l'array di Double e l'oggetto cm...così dovrebbe funzionare? funziona anche se comunque il metodo dovrebbe ricevere un E?Grazie
__________________
CASE Haf X MOBO Asrock Extreme4 CPU i5 2500K cooled By Thermalright Archon VGA Sapphire 6950 2GB RAM G.Skill Ripjaws-X F3 4GB 1333mhz PSU Enermax 500W modu 87+ HDD C300 64GB - f3 1TB - AAKS 500GB MONITOR Dell U2311H | Trattative completate |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Vicenza
Messaggi: 3949
|
Ho provato, ed il compilatore mi segnala questo:
<E>pincoPallo(E[], Comparator<E>) in Prova cannot be applied to (java.lang.Double[], DoubleComparator Ora, come io ho sempre pensato, è impossibile fare un metodo generico e poi passare un array di Double oppure ho sbagliato io qualcosa?
__________________
CASE Haf X MOBO Asrock Extreme4 CPU i5 2500K cooled By Thermalright Archon VGA Sapphire 6950 2GB RAM G.Skill Ripjaws-X F3 4GB 1333mhz PSU Enermax 500W modu 87+ HDD C300 64GB - f3 1TB - AAKS 500GB MONITOR Dell U2311H | Trattative completate |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Bergamo
Messaggi: 401
|
Avrai sbagliato qualcosa a livello di codice
Guarda qui: Codice:
import java.util.Comparator;
public class Comparatori {
static Double[] arrayDouble = null;
static Integer[] arrayInteger = null;
public static void main(String[] args){
arrayDouble = new Double[5];
arrayInteger = new Integer[5];
//riempio arrayDouble con numeri casuali
for(int i = 0; i < arrayDouble.length; i++){
arrayDouble[i] = Math.random() * 10;
}
//e faccio lo stesso con arrayInteger
for(int i = 0; i < arrayInteger.length; i++){
arrayInteger[i] = (int)(Math.random() * 10);
}
sort(arrayDouble, new DoubleComparator());
print(arrayDouble);
System.out.println("----------------");
sort(arrayInteger, new IntegerComparator());
print(arrayInteger);
}
public static <E> void sort(E[] array, Comparator<E> comp){
//un semplice BubbleSort
int lunghezza = array.length;
for(int j = 1; j < lunghezza; j++){
for(int i = 0; i < lunghezza - j; i++){
if(comp.compare(array[i], array[i+1]) > 0){
E temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
}
}
public static <E> void print(E[] array){
for(E element : array){
System.out.println(element);
}
}
private static class DoubleComparator implements Comparator<Double> {
//ritorna un numero positive se d1 > d2, un numero negativo se d1 > d2, zero se sono uguali
public int compare(Double d1, Double d2){
return (int)(d1-d2);
}
}
private static class IntegerComparator implements Comparator<Integer> {
//come prima, solo che stavolta li ordinerà al contrario
public int compare(Integer i1, Integer i2){
return i2-i1;
}
}
}
Ciauz
__________________
iMac 27" 5K |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Vicenza
Messaggi: 3949
|
ora provo
__________________
CASE Haf X MOBO Asrock Extreme4 CPU i5 2500K cooled By Thermalright Archon VGA Sapphire 6950 2GB RAM G.Skill Ripjaws-X F3 4GB 1333mhz PSU Enermax 500W modu 87+ HDD C300 64GB - f3 1TB - AAKS 500GB MONITOR Dell U2311H | Trattative completate |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:55.




















