Sort ArrayList bidimensionale

di il
7 risposte

Sort ArrayList bidimensionale

Ciao,

devo fare il sort di un array bidimensionale la cui forma è una serie di:

["expno", "exp", "comment"]

Ho provato una cosa del genere:

Collections.sort(expArray, new Comparator<ArrayList<String>>() {
            @Override
            public int compare(ArrayList<String> o1, ArrayList<String> o2) {
                return o1.get(0).compareTo(o2.get(0));
            }
        });
che però ordina chiaramente per stringa. Dato che il campo expno e' in realtà un numero, c'è modo di fare il sort per intero sul primo campo dell'array?

7 Risposte

  • Re: Sort ArrayList bidimensionale

    morellik ha scritto:


    che però ordina chiaramente per stringa. Dato che il campo expno e' in realtà un numero, c'è modo di fare il sort per intero sul primo campo dell'array?
    Partiamo da una cosa: se hai un ArrayList<ArrayList<String>> che è appunto una lista "bidimensionale", TUTTI i dati sono per forza String. Se il primo elemento di ogni sotto-lista è una stringa che contiene un numero es. "1234", semplicemente devi parsare la stringa, ottenere un int (o long, ecc... non so cosa è per te) e quindi comparare il numero (e non la stringa).
    Non è il massimo .... ma se non si può fare diversamente .....
  • Re: Sort ArrayList bidimensionale

    andbin ha scritto:


    Partiamo da una cosa: se hai un ArrayList<ArrayList<String>> che è appunto una lista "bidimensionale", TUTTI i dati sono per forza String. Se il primo elemento di ogni sotto-lista è una stringa che contiene un numero es. "1234", semplicemente devi parsare la stringa, ottenere un int (o long, ecc... non so cosa è per te) e quindi comparare il numero (e non la stringa).
    Non è il massimo .... ma se non si può fare diversamente .....
    Non so se è possibile creare un' ArrayList bidimensionale di dati di tipo misto. Se fosse possibile, non avrei problemi ad avere <Integer, String, String>.

    Ho provato con un ArrayList<ArrayList<Object>> ma non so come implementare il sorting.
  • Re: Sort ArrayList bidimensionale

    morellik ha scritto:


    Non so se è possibile creare un' ArrayList bidimensionale di dati di tipo misto.
    Ho provato con un ArrayList<ArrayList<Object>> ma non so come implementare il sorting.
    Sì, proprio così: ArrayList<ArrayList<Object>>

    Chiaramente nel comparatore devi prendere il primo elemento di ciascuna delle due sotto-liste a confronto, fare un cast a Integer e comparare i due Integer con il compareTo.
  • Re: Sort ArrayList bidimensionale

    andbin ha scritto:


    morellik ha scritto:


    Non so se è possibile creare un' ArrayList bidimensionale di dati di tipo misto.
    Ho provato con un ArrayList<ArrayList<Object>> ma non so come implementare il sorting.
    Sì, proprio così: ArrayList<ArrayList<Object>>

    Chiaramente nel comparatore devi prendere il primo elemento di ciascuna delle due sotto-liste a confronto, fare un cast a Integer e comparare i due Integer con il compareTo.
    Ho provato una cosa simile, ma IntelliJ mi dice "Cannot resolve method 'compareTo' in 'Object'"
    
      Collections.sort(expArray, new Comparator<ArrayList<Object>>() {
               @Override
                public int compare(ArrayList<Object> o1, ArrayList<Object> o2) {
                    return ((Integer)o1.get(0).compareTo((Integer)o2.get(0)));
                }
            });
            
          
  • Re: Sort ArrayList bidimensionale

    Trovato l'inghippo:
    
    
    Collections.sort(expArray, new Comparator<ArrayList<Object>>() {
               @Override
                public int compare(ArrayList<Object> o1, ArrayList<Object> o2) {
                    return (((Integer)o1.get(0)).compareTo((Integer)o2.get(0)));
                }
            });
    
    
    Questione di parentesi.
  • Re: Sort ArrayList bidimensionale

    morellik ha scritto:


    Questione di parentesi.
    Sì, esatto. In Java la invocazione di un metodo x.m() è più prioritario rispetto ad un cast.
    Nota: hai messo le parentesi più esterne che NON servono.

    Quindi prima prendi il valore: o1.get(0)
    Poi fai il cast del valore (racchiudendolo): ((Integer)o1.get(0))
    E poi invochi il compareTo: ((Integer)o1.get(0)).compareTo( ...... )

    Quindi:
    return ((Integer)o1.get(0)).compareTo((Integer)o2.get(0));
  • Re: Sort ArrayList bidimensionale

    Grazie
Devi accedere o registrarti per scrivere nel forum
7 risposte