Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: Problema con TreeSet

  1. #1

    Problema con TreeSet

    Ho j matrici che voglio ordinare in base agli elementi della prima colonna. Esempio:

    A1 =

    1 - 5 - 9
    4 - 6 - 10
    3 - 0 - 9

    A2 =

    0 - 9 - 9
    2 - 1 - 10

    A3 = ... ecc...

    B =

    0 - 9 - 9
    1 - 5 - 9
    2 - 1 - 10
    3 - 0 - 9
    4 - 6 - 10
    ...

    Ho due domande:

    1) Qual'è il metodo più veloce/prestazionale per ottenere B? Vettori dinamici o semplici cicli for annidati studiati appositamente? (Aj sono matrici Object[][])
    2) Perché se riempo l'oggetto 'TSB' in questo modo:
    TreeSet<Object[][]> TSB = new TreeSet<Object[][]>();
    add(riga i-esima di ognuna delle matrici Aj);
    java mi da questo errore?
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [[Ljava.lang.Object; cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1188)
    P.S.: Ovviamente non conosco il numero delle righe e delle colonne delle matrici Aj e non so quante matrici Aj ho, per questo pensavo ai vettori dinamici...
    Ultima modifica di giannino1995; 14-01-2014 a 14:33
    Più pratica in futuro...

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Mi sa che stai usando la struttura dati sbagliata per fare quello che ti serve.

    Con

    TreeSet<Object[][]> TSB = new TreeSet<Object[][]>();

    stai dicendo che TSB conterrà Object[][].

    ma con

    add(riga i-esima di ognuna delle matrici Aj);

    non si capisce bene cosa stai facendo.
    1. TSB.add(A[j][i])?
    2. TSB.add(A[i])?

    In entrambi i casi non stai passando un Object[][] ma
    1. Object
    2. Object[]

    E questo causa la ClassCastException...
    Ultima modifica di Alex'87; 14-01-2014 a 22:45
    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
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Spiega meglio cosa vuoi ottenere. Portarsi avanti matrici in questo modo può essere ostico, non puoi incapsulare meglio i tuoi dati? Cosa Rappresentano?

    Se devi tenere gli elementi ordinati per la prima colonna puoi fare una cosa del genere:

    TreeMap<Integer, Tupla<Integer, Integer>> treeMap = ...

    treeMap.put(primaColonna, new Tupla<Integer, Integer>(secondaColonna, terzaColonna));

    e passare un comparator custom alla mappa.


    *Per Tupla intendo un pojo minimale con i due campi che ti servono.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Aj sono delle matrici che contengono date e Integer. Sulla prima colonna ci sono o date o Integer. L'esempio che hai postato credo mi aiuti, riesci a spiegarmi cosa intendi per Tupla e pojo? Non ho mai sentito questi termini strani prima di ora.
    Più pratica in futuro...

  5. #5
    Cavolo, mi viene da piangere non so fare niente...
    Più pratica in futuro...

  6. #6
    Ma aspetta sul mio manuale avevo letto un bel esempio su TreeMap, forse posso usare quella! Fammi andare a vedere...
    Più pratica in futuro...

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Aj sono delle matrici che contengono date e Integer. Sulla prima colonna ci sono o date o Integer. L'esempio che hai postato credo mi aiuti, riesci a spiegarmi cosa intendi per Tupla e pojo? Non ho mai sentito questi termini strani prima di ora.
    Un POJO (Plain Old Java Object) è un oggettino java stupido, senza logica business all'interno.
    Una tupla vedila semplicemente come un insieme di oggetti, è solo una comodità per portarti avanti oggetti senza impazzire.

    Esempio:

    codice:
    public class Tupla2<T, U>
    {
      private T campo1;
      private U campo2;
     
      public Tupla2(T campo1, U campo2) 
      {
        this.campo1 = campo1;
        this.campo2 = campo2;
      }
    
      public T getCampo1() 
      {  
        return campo1;
      }
    
      public void setCampo1(T campo1) 
      {
        this.campo1 = campo1;
      }
     
      public U getCampo2() 
      {  
        return campo2;
      }
      
      public void setCampo2(U campo2) 
      {
        this.campo2 = campo2;
      }
    }
    (Tupla2 perché ha 2 elementi 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

  8. #8
    Adesso do un'occhiata a quello che hai scritto però credo di aver risolto in questo modo. Potrei avere un tuo parere?

    codice:
    package prova;
    
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    public class Esempio {
    
        public static void main(String[] args) {
            Object[][] A1 = { { 1, 5, 9 }, { 4, 6, 10 }, { 3, 0, 9 } };
            Object[][] A2 = { { 0, 9, 9 }, { 2, 1, 10 } };
            TreeMap<Object, Object[]> tm = new TreeMap<Object, Object[]>();
            tm.put(A1[0][0], A1[0]);
            tm.put(A1[1][0], A1[1]);
            tm.put(A1[2][0], A1[2]);
            tm.put(A2[0][0], A2[0]);
            tm.put(A2[1][0], A2[1]);
            // Nel software originale ci sono dei cicli particolari... non soffermarti su questo punto...
            Set<Map.Entry<Object, Object[]>> set = tm.entrySet();
            int m = set.size();
            Object[][] B = new Object[m][];
            int j = 0;
            for (Map.Entry<Object, Object[]> me : set) {
                int colonne = me.getValue().length;
                Object[] riga = me.getValue();
                B[j] = new Object[colonne];
                for (int k = 0; k < colonne; k++) { // Non c'è nulla di più veloce di questo? :( :( :(
                    B[j][k] = riga[k];
                }
                j++;
            }
        }
    }

    Non riesco a usare meno di 2 cicli for e TreeMap al proprio interno esegue degli ordinamenti percui e come ce ne fossero come minimo 3, l'algoritmo per capirci è molto dispendioso. Il mio problema è che non riesco a convertire questa TreeMap che difatto contiene già quello che mi serve in una benedetta matrice. Ho anche provato questo comando interessante ma poi non so che farmene:

    codice:
    List<Value> list = new ArrayList<Value>(map.values());
    Più pratica in futuro...

  9. #9
    Aspetta sono un idiota, ecco qui la soluzione, dimmi cosa ne pensi:

    codice:
    package prova;
    
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    public class Esempio {
    
        public static void main(String[] args) {
            Object[][] A1 = { { 1, 5, 9 }, { 4, 6, 10 }, { 3, 0, 9 } };
            Object[][] A2 = { { 0, 9, 9 }, { 2, 1, 10 } };
            TreeMap<Object, Object[]> tm = new TreeMap<Object, Object[]>();
            tm.put(A1[0][0], A1[0]);
            tm.put(A1[1][0], A1[1]);
            tm.put(A1[2][0], A1[2]);
            tm.put(A2[0][0], A2[0]);
            tm.put(A2[1][0], A2[1]);
            Set<Map.Entry<Object, Object[]>> set = tm.entrySet();
            int m = set.size();
            Object[][] B = new Object[m][];
            int j = 0;
            for (Map.Entry<Object, Object[]> me : set) {
                int colonne = me.getValue().length;
                Object[] riga = me.getValue();
                B[j] = new Object[colonne];
                B[j] = riga;
                j++;
            }
            System.out.println("Verifica: "+B[3][2]);
        }
    }
    Più pratica in futuro...

  10. #10
    Oppure ancora:

    codice:
    package prova;
    
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    public class Esempio {
    
    	public static void main(String[] args) {
    		Object[][] A1 = { { 1, 5, 9 }, { 4, 6, 10 }, { 3, 0, 9 } };
    		Object[][] A2 = { { 0, 9, 9 }, { 2, 1, 10 } };
    		TreeMap<Object, Object[]> tm = new TreeMap<Object, Object[]>();
    		tm.put(A1[0][0], A1[0]);
    		tm.put(A1[1][0], A1[1]);
    		tm.put(A1[2][0], A1[2]);
    		tm.put(A2[0][0], A2[0]);
    		tm.put(A2[1][0], A2[1]);
    		Set<Map.Entry<Object, Object[]>> set = tm.entrySet();
    		int m = set.size();
    		Object[][] B = new Object[m][];
    		int j = 0;
    		for (Map.Entry<Object, Object[]> me : set) {
    			B[j] = new Object[me.getValue().length];
    			B[j] = me.getValue();
    			j++;
    		}
    		System.out.println("Verifica: "+B[3][2]);
    	}
    }
    Si può fare di meglio?
    Più pratica in futuro...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.