Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-12-2008, 12: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 12:23.
3vi è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 12: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 13:50.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 13: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, 14:01   #4
!fazz
Moderatore
 
L'Avatar di !fazz
 
Iscritto dal: Nov 2006
Messaggi: 22006
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, 14: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 14:08.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2008, 14:07   #6
!fazz
Moderatore
 
L'Avatar di !fazz
 
Iscritto dal: Nov 2006
Messaggi: 22006
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, 14: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, 19: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, 20: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, 21: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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
30.000 Pa e lavaggio a 100°C: DREAME...
Nioh 3 vola oltre 1 milione di copie, la...
AMD Radeon RX 9060 XT: staccato (di molt...
WhatsApp introduce la condivisione della...
iPad con chip A16 a 339€: l'11'' con 128...
OpenClaw spaventa le aziende: perch&eacu...
Samsung T7 2TB crolla su Amazon: SSD por...
Tutte le JBL a prezzi da non perdere su ...
PS6 e RDNA 5: la GPU sarà 'quasi ...
Meta cambia rotta sul metaverso: Horizon...
Zeekr debutta in Italia con Jameel Motor...
Robotaxi sotto controllo remoto: Waymo a...
Ubisoft continua i tagli: 40 licenziamen...
PromptSpy: il primo malware Android che ...
Navigare all'estero con costi accessibil...
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: 15:01.


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