Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-12-2008, 11:20   #1
3vi
Senior Member
 
L'Avatar di 3vi
 
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 11:23.
3vi è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 11:50   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
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 12:50.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 12:15   #3
3vi
Senior Member
 
L'Avatar di 3vi
 
Iscritto dal: Sep 2005
Città: Vicenza
Messaggi: 3949
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
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.
pincoPallo è un metodo per ordinare un array di qualsiasi tipo. Quello che io mi chiedo è: essendo definito pincoPallo genericamente, cosa devo fare perchè io possa ordinare il mio array di Double?

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
3vi è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 13:01   #4
!fazz
Moderatore
 
L'Avatar di !fazz
 
Iscritto dal: Nov 2006
Messaggi: 22159
Quote:
Originariamente inviato da 3vi Guarda i messaggi
pincoPallo è un metodo per ordinare un array di qualsiasi tipo. Quello che io mi chiedo è: essendo definito pincoPallo genericamente, cosa devo fare perchè io possa ordinare il mio array di Double?

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
ma se devi ordinare un array di double ti basta usare una collection

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
!fazz è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 13:03   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
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
}
poi puoi usarlo così:
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());
Spero di non aver commesso erroracci


@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 13:08.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 13:07   #6
!fazz
Moderatore
 
L'Avatar di !fazz
 
Iscritto dal: Nov 2006
Messaggi: 22159
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
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
}
poi puoi usarlo così:
Codice:
double[] primitives = new double[5];
for(int i = 0;  i < primitives.length;  i++)
    primitives[i] = i+1;

Double result = pincoPallo(primitives, new DoubleComparator());
Spero di non aver commesso erroracci


@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.


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
!fazz è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 13:54   #7
3vi
Senior Member
 
L'Avatar di 3vi
 
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
3vi è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 18:31   #8
3vi
Senior Member
 
L'Avatar di 3vi
 
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
3vi è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 19:36   #9
Don[ITA]
Senior Member
 
L'Avatar di Don[ITA]
 
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;
        }
    }
}
Probabilmente avrai fatto qualco casino con gli static

Ciauz
__________________
iMac 27" 5K
Don[ITA] è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 20:10   #10
3vi
Senior Member
 
L'Avatar di 3vi
 
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
3vi è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
Cyberpunk 2077 non si ferma e raggiunge ...
Samsung alza ancora i prezzi delle memor...
4 sconti tutti nuovi riscrivono la TOP 1...
Portatile HP con Intel Core Ultra 7 155H...
Smart TV Haier 50'' 4K crolla a 225,99€ ...
Google Pixel 10a a 399€ o 497€ (256GB) c...
Compare dal nulla e blocca lo schermo: c...
Tornano i super prezzi Nikon su Amazon, ...
Compatto, leggerissimo (1,2Kg), ma con 3...
Privacy Display per tutti i Galaxy S: Sa...
Le migliori cuffie in offerta su Amazon ...
SpaceX Starship: Ship 40 ha eseguito un ...
Redmi Note 17 a un passo dal debutto, ma...
Gli aumenti di prezzo del PS Plus potreb...
Almeno 64 GB di RAM per giocare? Il caso...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v