Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [JAVA] - interfaccia Comparator<T>

    Ecco un nuovo quesito per voi maghi della programmazione java.
    Quello che voglio fare oggi è ordinare un esemplare di Coin[] utilizzando una classe che implementa Comparator.

    codice:
    Coin.java 
    /** A class to manage coins
     * @author Simone
     */
    
    public class Coin
    {
    	/** 
    	 * Construct a new coin of a certain type
    	 * @param aValue value of the coin
    	 * @param aName name of the coin
    	 */
    	public Coin (String aName, double aValue)
    	{
    		name = aName;
    		value = aValue;
    	}
    	
    	/** 
    	 * Return the value of the inserted coin
    	 * @return value in dollars
    	 */
    	public double getValue()
    	{
    		return value;
    	}
    		
    	/**
    	 * Return the name of the coin
    	 * @return name of coin
    	 */
    	public String getName()
    	{
    		return name;
    	}
    
    	private String name;
    	private double value;
    }
    
    
    CoinComparator.java
    /**
     * A class to compare Coin
     * @author Simone
     *
     */
    public class CoinComparator implements Comparator<Coin>
    {
    	public int compare(Coin a, Coin b)
    	{
    		if (a.getValue() < b.getValue()) return -1;
    		if (a.getValue() == b.getValue()) return 0;
    		return 1;
    	}
    }
    
    
    Comparator.java
    /**
     * 
     * @author Simone
     * A class to compare coin
     * @param <Coin> samples of Coin
     */
    public interface Comparator<Coin>
    {
    	int compare(Coin a, Coin b);
    }
    A parte il javadoc scritto un pò di fretta, la classe dovrebbe andar bene. Vorrei testarla in questo modo
    codice:
    Tester.java
    import java.util.Arrays;
    
    public class Tester
    {
    	public static void main(String[] args)
    	{
    		//Creo esemplari di coin
    		Coin quarters = new Coin("quarters", 0.25);
    		Coin dimes = new Coin("dimes", 0.10);
    		Coin pennies = new Coin("pennies", 0.05);
    		Coin nickels = new Coin("nickels", 0.01);	
    	
    		//Creo un comparatore e comparo due coin qualsiasi		
    		CoinComparator c = new CoinComparator();		
    		int n = c.compare(quarters, dimes);
    		System.out.print(n);//Stampa 1 -> OK
    		
    		//Creo un array di Coin
    		Coin[] coins = {quarters, dimes, pennies, nickels};		
    		Arrays.sort(coins, new CoinComparator());//Errore: the method is not applicable
    	}
    }
    In pratica quando scrivo il programma tester Eclipse mi dice che l'ultimo metodo non è applicabile. Perchè? Chiedo lumi a voi perchè io davvero non capisco

    Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [JAVA] - interfaccia Comparator<T>

    Il metodo Arrays.sort() vuole come secondo parametro un comparatore di tipo java.util.Comparator. CoinComparator è un comparatore che implementa una tua versione di Comparator. Il fatto che la tua interfaccia abbia lo stesso nome di quella di Java non vuol dire nulla anzi, confonde e basta.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3

    Re: Re: [JAVA] - interfaccia Comparator<T>

    Originariamente inviato da Alex'87
    Il metodo Arrays.sort() vuole come secondo parametro un comparatore di tipo java.util.Comparator. CoinComparator è un comparatore che implementa una tua versione di Comparator. Il fatto che la tua interfaccia abbia lo stesso nome di quella di Java non vuol dire nulla anzi, confonde e basta.
    Prima di tutto grazie per la risposta
    Quindi cosa dovrei modificare per utilizzare il metodo Arrays.sort?

  4. #4
    Elimina la tua interfaccia Comparator e fai implementare alla classe CoinComparator l'interfaccia java.util.Comparator
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Originariamente inviato da satifal
    Elimina la tua interfaccia Comparator e fai implementare alla classe CoinComparator l'interfaccia java.util.Comparator
    Ok fatto così funziona tutto. Grazie mille!!

    Ma quindi quell'interfaccia da me creata non serve a nulla? Potrebbe servirmi creare un'interfaccia del genere in qualche caso o mi basta semplicemente implementare l'interfaccia Comparator nella classe di confronto (tipo CoinComparator per intenderci)?

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da tigerjack89
    Ma quindi quell'interfaccia da me creata non serve a nulla?
    Non serve a nulla se vuoi usare i metodi di java che fanno uso di comparatori. Se invece vuoi crearti dei tuoi comparatori per esercizio sei libero di farlo ovviamente!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Originariamente inviato da Alex'87
    Non serve a nulla se vuoi usare i metodi di java che fanno uso di comparatori. Se invece vuoi crearti dei tuoi comparatori per esercizio sei libero di farlo ovviamente!
    ...ma a quel punto non posso usare i metodi come Arrays.sort, giusto??

    Allora, altro quesito. Devo ordinare delle stringhe per lunghezza. Se le stringhe hanno la stessa lunghezza le ordino in ordine alfabetico. Ho provato a fare in questo modo e si trova; tuttavia non sono tanto sicuro che il metodo sia giusto. Voi che dite?
    codice:
    StringLengthComparator.java
    
    import java.util.Comparator;
    
    public class StringLengthComparator implements Comparator<String>
    {
    	public int compare(String a, String b)
    	{
    		if (a.length() < b.length()) return -1;
    		if (a.length() > b.length()) return 1;
    		
    		StringLexicographyComparator s = new StringLexicographyComparator();
    		return s.compare(a, b);
    	}
    }
    
    StringLexicographyComparator.java
    
    import java.util.Comparator;
    
    public class StringLexicographyComparator implements Comparator<String>
    {
    	public int compare(String a, String b)
    	{
    		return a.compareToIgnoreCase(b);
    	}
    }
    Grazie mille ancora

  8. #8
    Originariamente inviato da tigerjack89
    Allora, altro quesito. Devo ordinare delle stringhe per lunghezza. Se le stringhe hanno la stessa lunghezza le ordino in ordine alfabetico. Ho provato a fare in questo modo e si trova; tuttavia non sono tanto sicuro che il metodo sia giusto. Voi che dite?
    Puoi usare il metodo compareTo(String s) della classe String per confrontarle, rispettando dunque l'ordine alfabetico.

  9. #9
    Originariamente inviato da VincenzoTheBest
    Puoi usare il metodo compareTo(String s) della classe String per confrontarle, rispettando dunque l'ordine alfabetico.
    Grazie per la risposta
    Senza realizzare l'interfaccia StringLexicographyComparator intendi??

  10. #10
    Originariamente inviato da tigerjack89
    Grazie per la risposta
    Senza realizzare l'interfaccia StringLexicographyComparator intendi??
    Si, intendevo quello.
    Ad esempio:
    codice:
    import java.util.Comparator;
    public class MyStringComparator implements Comparator<String>{
            @Override
    	public int compare(String o1, String o2) {
                    if( o1.length() != o2.length() )
                        return o1.length() - o2.length();
                    return o1.compareTo(o2);
    	}
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.