From e5069081a008996fe6fd8a8613eb38c1adb20668 Mon Sep 17 00:00:00 2001 From: La Programmatrice Verde Date: Tue, 4 Nov 2025 21:18:32 +0100 Subject: [PATCH] Refactor CalcolaPrimaTerna --- src/appComune/GestisciCodiceFiscale.java | 130 +++++++++++++---------- 1 file changed, 73 insertions(+), 57 deletions(-) diff --git a/src/appComune/GestisciCodiceFiscale.java b/src/appComune/GestisciCodiceFiscale.java index cc1f4da..a670d44 100644 --- a/src/appComune/GestisciCodiceFiscale.java +++ b/src/appComune/GestisciCodiceFiscale.java @@ -22,7 +22,6 @@ public class GestisciCodiceFiscale { } static String CalcolaPrimaTerna(String cognome) { - boolean exit = false; String ritorno; for (String carattere : CARATTERI_DA_RIMUOVERE) { cognome = GestisciStringhe.rimuoviCarattere(cognome, carattere); @@ -31,71 +30,24 @@ public class GestisciCodiceFiscale { cognome = cognome.toLowerCase(); char[] caratteriCognome = cognome.toCharArray(); - int[] posizioniConsonanti = new int[4]; - - for (int j = 0; j < posizioniConsonanti.length; j++) { - for (int i = posizioniConsonanti[j]; i < caratteriCognome.length && !exit; i++) { - if (GestisciStringhe.isConsonante(caratteriCognome[i])) { - exit = true; - posizioniConsonanti[j + 1] = i; - } - } - } - - if (posizioniConsonanti[1] == 0) { // non è stata trovata la prima consonante, ovvero non ce ne sono - char primaVocale = 0; - int posizionePrimaVocale = 0; - - for (int i = 0; i < caratteriCognome.length && !exit; i++) { - if (GestisciStringhe.isVocale(caratteriCognome[i])) { - exit = true; - primaVocale = caratteriCognome[i]; - posizionePrimaVocale = i; - } - } - - char secondaVocale = 0; - - for (int i = posizionePrimaVocale; i < caratteriCognome.length && !exit; i++) { - if (GestisciStringhe.isVocale(caratteriCognome[i])) { - exit = true; - secondaVocale = caratteriCognome[i]; - } - } - - ritorno = Character.toString(primaVocale) - + Character.toString(secondaVocale) - + Character.toString('x'); + int[] posizioniConsonanti = trovaConsonanti(cognome); + if (posizioniConsonanti[0] == 0) { // non è stata trovata la prima consonante, ovvero non ce ne sono + ritorno = quintoCasoCognome(caratteriCognome); } else { - if (posizioniConsonanti[3] == 0) { // non è stata trovata la terza consonante, AKA l'array nell'ultima + if (posizioniConsonanti[2] == 0) { // non è stata trovata la terza consonante, AKA l'array nell'ultima // posizione // ha valore di default - char primaVocale = 0; - int posizionePrimaVocale = 0; - - for (int i = 0; i < caratteriCognome.length && !exit; i++) { - if (GestisciStringhe.isVocale(caratteriCognome[i])) { - exit = true; - primaVocale = caratteriCognome[i]; - posizionePrimaVocale = i; - } - } - if (posizioniConsonanti[2] == 0) { // non è stata trovata la seconda consonante, AKA l'array nella + char primaVocale = trovaPrimaVocale(caratteriCognome)[0]; + int posizionePrimaVocale = trovaPrimaVocale(caratteriCognome)[1]; + if (posizioniConsonanti[1] == 0) { // non è stata trovata la seconda consonante, AKA l'array nella // penultima // posizione // ha valore di default - char secondaVocale = 0; + int secondaVocale = trovaSecondaVocale(caratteriCognome, posizionePrimaVocale); - for (int i = posizionePrimaVocale; i < caratteriCognome.length && !exit; i++) { - if (GestisciStringhe.isVocale(caratteriCognome[i])) { - exit = true; - secondaVocale = caratteriCognome[i]; - } - } - - if (!exit) { + if (secondaVocale == -1) { ritorno = Character.toString(caratteriCognome[posizioniConsonanti[1]]) + Character.toString(primaVocale) + Character.toString('x'); @@ -144,6 +96,70 @@ public class GestisciCodiceFiscale { return ritorno; } + static int[] trovaConsonanti(String cognome) { + boolean exit = false; + char[] caratteriCognome = cognome.toCharArray(); + int[] posizioniConsonanti = new int[4]; + int[] ritorno = new int[3]; + + for (int j = 0; j < posizioniConsonanti.length; j++) { + for (int i = posizioniConsonanti[j]; i < caratteriCognome.length && !exit; i++) { + if (GestisciStringhe.isConsonante(caratteriCognome[i])) { + exit = true; + posizioniConsonanti[j + 1] = i; + } + } + } + + ritorno[0] = posizioniConsonanti[1]; + ritorno[1] = posizioniConsonanti[2]; + ritorno[2] = posizioniConsonanti[3]; + + return ritorno; + } + + static char[] trovaPrimaVocale(char[] caratteriCognome) { + boolean exit = false; + char[] ritorno = new char[2]; + + for (int i = 0; i < caratteriCognome.length && !exit; i++) { + if (GestisciStringhe.isVocale(caratteriCognome[i])) { + exit = true; + ritorno[0] = caratteriCognome[i]; + ritorno[1] = (char) i; + } + } + + return ritorno; + } + + static int trovaSecondaVocale(char[] caratteriCognome, int posizionePrimaVocale) { + int ritorno = -1; + boolean exit = false; + + for (int i = posizionePrimaVocale; i < caratteriCognome.length && !exit; i++) { + if (GestisciStringhe.isVocale(caratteriCognome[i])) { + exit = true; + ritorno = caratteriCognome[i]; + } + } + + return ritorno; + } + + static String quintoCasoCognome(char[] caratteriCognome) { + char primaVocale = trovaPrimaVocale(caratteriCognome)[0]; + int posizionePrimaVocale = trovaPrimaVocale(caratteriCognome)[1]; + char secondaVocale = (char) trovaSecondaVocale(caratteriCognome, posizionePrimaVocale); + String ritorno; + + ritorno = Character.toString(primaVocale) + + Character.toString(secondaVocale) + + Character.toString('x'); + + return ritorno; + } + static String CalcolaSecondaTerna(String nome) { for (String carattere : CARATTERI_DA_RIMUOVERE) { nome = GestisciStringhe.rimuoviCarattere(nome, carattere);