Filtraggio di caratteri iniziali / finali comuni da matrice / lista di stringhe

1

Ok, per esempio ho una serie di stringhe con ogni stringa come sotto:

364VMS1029 
364VMSH920 
364VMSH192 
364VMSU839 
364VMN2382 
364VMR223
364VMR2X3 
364VMN829 
364VMN8757 
364VMN831

Come posso ottenere dinamicamente il programma per riconoscere i caratteri comuni tra tutte le stringhe dell'array, che in questo caso è 364VM e filtrarle? Se non c'è un carattere comune, non fare nulla.

    
posta user3373225 24.07.2014 - 14:10
fonte

2 risposte

2

Quando hai un problema complicato che non puoi risolvere, prova a scomporlo in problemi più semplici e risolvili.

Il tuo problema è stato riformulato:

Remove the common prefix and suffix from a list of strings.

Un problema più semplice potrebbe essere:

Find the common prefix for a pair of strings.

Questo dovrebbe essere molto più semplice da risolvere, ad esempio in questo modo:

string GetPrefix(string first, string second)
{
    int prefixLength = 0;

    for (int i = 0; i < Math.Min(first.Length, second.Length); i++)
    {
        if (first[i] != second[i])
            break;

        prefixLength++;
    }

    return first.Substring(0, prefixLength);
}

Ora che hai questo, puoi ricostruire il problema originale:

Find the common prefix for a list of strings.

Qui è molto utile rendersi conto che il prefisso delle tre stringhe è uguale al prefisso del prefisso delle prime due stringhe e della terza stringa. (Hmm, questo suona confuso, forse sarà più chiaro in una notazione più formale: prefisso (A, B, C) = prefisso (prefisso (A, B), C).)

Ciò significa che puoi utilizzare il metodo LINQ Aggregate() su GetPrefix() metodo sopra per ottenere il prefisso di un intero elenco di stringhe:

string GetPrefix(IEnumerable<string> strings)
{
    return strings.Aggregate(GetPrefix);
}

Il prossimo passo:

Remove the common prefix from a list of strings.

Ora che possiamo trovare il prefisso comune, possiamo rimuoverlo usando LINQ Select() e Substring() :

IEnumerable<string> RemovePrefix(IEnumerable<string> strings)
{
    var prefix = GetPrefix(strings);

    return strings.Select(s => s.Substring(prefix.Length, s.Length - prefix.Length));
}

Si presume che si desideri ottenere una nuova sequenza contenente le stringhe filtrate. Se desideri modificare una raccolta esistente, utilizza un ciclo for anziché Select() .

Un ultimo passaggio:

Remove the common prefix and suffix from a list of strings.

Lascerò questo come esercizio per il lettore. Questa risposta contiene un semplice codice per l'inversione di una stringa , che potrebbe essere utile. (Penso che tu non abbia bisogno del codice di altre risposte a quella domanda, dal momento che sembra che le tue stringhe siano solo ASCII.)

    
risposta data 02.08.2014 - 22:52
fonte
1

Devi confrontare ogni carattere all'inizio delle stringhe per vedere quanto è lungo il prefisso comune più lungo e fermarti una volta trovata la differenza.

(A seconda di quanto sia costoso l'accesso alle stringhe e l'ordinamento, potrebbe risparmiare tempo prima ordinando l'elenco e poi guardando solo la prima e l'ultima stringa - qualunque cosa abbiano in comune volontà, definizione, essere comuni a tutte le stringhe tra di loro, ma è questione di profilazione per scoprire se questo salva o aggiunge tempo.)

    
risposta data 24.07.2014 - 14:16
fonte

Leggi altre domande sui tag