Distanza tra numeri in una stringa di testo

Un esercizio introduttivo all’uso di Java e delle stringhe di testo. Data una stringa di testo in input utente, si vuole restituire la massima differenza, o meglio la massima distanza, tra le cifre numeriche presenti nella stringa stessa.

Es. a2qwer5ty -> le cifre numeriche sono 2 e 5 e la loro distanza è 5

Es a2e4tyuiop5 -> la distanza tra 2 e 4 è 2 mentre ra 4 e 5 è 7

L’esercizio è un po’ scomodo da risolvere in Java perché ha una classica impostazione da esercizio con funzioni e manipolazione stringhe da C/C++. Java però ha una grande versatilità e basta comprendere che le funzioni a supporto del metodo statico main devono esse dichiarate nella classe Main stessa come pubbliche (anche statiche andrebbe bene) e richiamate dopo aver inizializzato la classe Main stessa.

Superato lo scoglio del come costruire il codice di utilità, l’algoritmo non è difficile: basta trovare una lettera e riciclare dalla lettera stessa in poi per trovarne una seconda, conteggiando i salti e valutando se si sia arrivati ad una lettera finale o se non ce ne sono proprio nella stringa da analizzare.

import java.util.Scanner;
public class Main
{
    /***
     * Restituisce la distanza massima tra due caratteri numerici
     *  Es input -> ab2cdef7m   return 5
     */
    public int differenzaNumerici(String _testo)
    {
        int maxdist = 0;
        int dist = 0;
        int numchar = 0;

        //caso semplice: non ci sono due numeri
        for (int i=0; i < _testo.length(); i++)
        {
            if (Character.isDigit(_testo.charAt(i)))
                numchar++;
        }

        if (numchar < 2)
            return -1;

        //caso complesso: ci sono almeno due numeri da conteggiare

        //prendo una lettera come riferimento e controllo quelle dopo
        for (int i=0; i < _testo.length(); i++)
        {
            //cerco un numero
            if (Character.isDigit(_testo.charAt(i)) )
            {
                dist = 0;
                System.out.println("Ho trovato un numero, vedo il prossimo");
                //provo a cercare la successiva lettera
                for(int j=i+1; j < _testo.length(); j++)
                {
                    if (Character.isLetter(_testo.charAt(j)))
                    {
                        System.out.println("Conteggio una lettera");
                        dist++;
                    }
                    else
                    {
                        //ho trovato un numero esco
                        break;
                    }

                    //se sono arrivato alla fine e non trovo una letetra tocca resettare dist
                    if ( (_testo.length() -1) == j &&
                            dist > 0)
                        dist = 0;
                }
            }

            if (dist > maxdist)
                maxdist = dist;

        }
        return maxdist;
    }

    public static void main(String args[])
    {
        System.out.println("|------------------------------------------------|");
        System.out.println("| Distanza tra caratteri numerici di una stringa |");
        System.out.println("|------------------------------------------------|");

        System.out.println("Inserisci la stringa da controllare: ");
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();

        Main m = new Main();
        System.out.println("La distanza massima è " + m.differenzaNumerici(s));
    }
}

Ultima modifica 2 Ottobre 2022