Problema con liste

di il
4 risposte

Problema con liste

Salve a tutti. Sto progettando un programma da qualche giorno ed ho un problema con una funzione:
data una List<String> al cui interno ci sono più stringhe, anche ripetute, devo ottenere una List<String> al cui interno le Stringhe devono essere ordinate in maniera decrescente per ripetizioni e, a parità di ripetizioni, alfabeticamente.
tramite gli stream sono riuscito, in maniera abbastanza semplice, a ordinare alfabeticamente... ma non riesco a gestire la parte che riguarda le ripetizioni. chi riesce a darmi una mano?

4 Risposte

  • Re: Problema con liste

    Java ha gia' implementato una serie di oggetti il cui compito e' quello di fare ordinamenti, basato su diversi concetti:

    - il concetto di comparable che puo' essere definito per una classe, ma che e' unico per quella classe
    - il concetto di comparatore cio' un'altro oggetto il cui compito e' quello di prendere DUE oggetti e compararli in qualche modo

    Guardati: Arrays.sort(), e Collections.sort().

    Naturalmente, questo e' solo UN pezzo della soluzione.
    La seconda parte consiste nel CONTARE le stringhe uguali. Un modo per farlo e' usare il concetto di Bag:

    il bag e' come un set, ma tiene traccia ANCHE del numero d volte che un oggetto e' stato inserito o rimosso.

    Se non sai che cosa e' un 'set' e come e' implementato in Java, o come si implementa una classe, allora e' meglio che vai a ristudiare gli appunti, perche' la soluzione dell'esercizio RICHIEDE esattamente questo tipo di conoscenze.
  • Re: Problema con liste

    Il mio problema è proprio quello di non riuscire a scrivere il codice riguardante questo problema... avrei bisogno di una mano in questo
  • Re: Problema con liste

    Bradipo ha scritto:


    data una List<String> al cui interno ci sono più stringhe, anche ripetute, devo ottenere una List<String> al cui interno le Stringhe devono essere ordinate in maniera decrescente per ripetizioni e, a parità di ripetizioni, alfabeticamente.
    Sarò breve, tra poco ho la tv .... ti dico come lo affronterei io (poi appena ho tempo provo ad implementarlo per verifica mia).
    Innanzitutto tramite gli Stream si può sicuramente arrivare ad avere una "map" in cui le entry sono stringa--->contatore (delle ripetizioni). Poi si implementa un Comparator (per il sort) che usa anche tale map. Per "lookup" nella mappa si ottengono di volta in volta i due contatori. Se i contatori sono diversi, si ha già il risultato di minore o maggiore e basta. Se sono uguali, si confrontano le due stringhe lessicograficamente (che vuol dire, carattere per carattere, secondo i codici Unicode).
  • Re: Problema con liste

    Bradipo ha scritto:


    le Stringhe devono essere ordinate in maniera decrescente per ripetizioni e, a parità di ripetizioni, alfabeticamente.
    Confermo (ho provato a farlo) che si può fare come dicevo prima.

    Se si parte con una lista così:

    [mela, banana, arancia, mela, limone, banana, mela, pera, ciliegia, limone]

    la lista verrebbe ordinata così:

    [mela, mela, mela, banana, banana, limone, limone, arancia, ciliegia, pera]

    Ovvero: mela ha frequenza 3 (più delle altre), quindi è per prima. banana e limone hanno stessa frequenza 2. Vengono quindi dopo mela ma avendo stessa frequenza sono ordinate cioè prima banana e poi limone. Mentre arancia/ciliegia/pera hanno frequenza 1 quindi vengono per ultime.

    È esattamente questo che volevi, giusto?
Devi accedere o registrarti per scrivere nel forum
4 risposte