Autore Topic: Search String in Array  (Letto 474 volte)

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Search String in Array
« il: 10 Luglio 2015, 17:09:35 CEST »
0
Per cercare una stringa in un array di stringhe ho deciso di usare:

Codice (Java): [Seleziona]
Arrays.asList(mArray).contains(mString); // boolean
Questa operazione è molto veloce anche su array molto grandi.

Il problema è che è case sensitive... Quindi se in mArray c'è : "Pippo" e la mia mString è "pippo" ritornerà false

Come potrei risolvere il problema? 
Grazie.

PS: Ciclare l'array non è proponibile.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Search String in Array
« Risposta #1 il: 10 Luglio 2015, 17:12:06 CEST »
0
Ciclo forma e fai due if.

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Search String in Array
« Risposta #2 il: 10 Luglio 2015, 17:19:57 CEST »
0
Ciao,

Grazie della risposta, scusa ma non ho proprio capito cosa hai scritto.

NB: Come avevo scritto sopra, ciclare l'array non è proponibile.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 593
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Search String in Array
« Risposta #3 il: 10 Luglio 2015, 17:31:51 CEST »
0
Puoi creare un wrapper del tuo array che implementi l'interfaccia List<T> (che è la stessa identica cosa che fa Arrays.asList).

Nel tuo wrapper implementi il metodo contains(Object o) in modo che faccia una verifica case insensitive. Che prevede un'iterazione dell'array (mascherata, però).

Considera che contains è un metodo dell'interfaccia List<T>. Essendo l'interfaccia orientata ad un tipo generico di dato T non è in grado di concepire il concetto di "case sensitive", che invece è specifico per le stringhe.

Inoltre l'implementazione standard di contains invoca il metodo "compare" degli oggetti T, quindi non puoi nemmeno intervenire nel tipo di controllo effettuato, a meno di non fare l'overload di contains come ho detto.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Search String in Array
« Risposta #4 il: 10 Luglio 2015, 18:04:59 CEST »
0
@LinkOut, mi scuso. Non avevo proprio visto il PS :)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 593
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Search String in Array
« Risposta #5 il: 10 Luglio 2015, 18:05:20 CEST »
+2
Qualcosa del genere:

Codice (Java): [Seleziona]
public class StringArray extends ArrayList<String> {

        public StringArray(String[] stringArray) {
                super(Arrays.asList(stringArray));
        }
       
        @Override
        public boolean contains(Object object) {
                if (object instanceof String) {
                        return contains((String) object);
                }
                return false;
        }
       
        private boolean contains(String s) {
                boolean retVal = false;
               
                for (int i = 0; i < size() && retVal == false; i++)
                        retVal = (get(i).compareToIgnoreCase(s) == 0);

                return retVal;
        }
}

Che poi usi così:

Codice (Java): [Seleziona]
new StringArray(mArray).contains(mString); // boolean
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Search String in Array
« Risposta #6 il: 13 Luglio 2015, 08:33:01 CEST »
0
Ottima soluzione, problema risolto!

Grazie.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Search String in Array
« Risposta #7 il: 13 Luglio 2015, 09:25:03 CEST »
0
Ma questa soluzione USA comunque un ciclo...

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 593
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Search String in Array
« Risposta #8 il: 13 Luglio 2015, 10:34:06 CEST »
0
@tonno: la differenza è che il ciclo è mascherato ed il chiamante non ne sa nulla.

Internamente la maggior parte delle implementazioni del metodo contains(); fa un ciclo, altrimenti come fa a verificare se c'è una corrispondenza?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

iClaude

  • Visitatore
Re:Search String in Array
« Risposta #9 il: 13 Luglio 2015, 13:57:35 CEST »
0
Ma questa soluzione USA comunque un ciclo...

In effetti in questo caso con un semplice ciclo avrebbe fatto 10 volte prima.
Tra l'altro la funzione contains usa una ricerca lineare,  quindi non c'è alcun guadagno di prestazioni.
Se l'array fosse già ordinato si potrebbe usare una ricerca binaria per velocizzare i tempi.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 593
  • Respect: +132
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Search String in Array
« Risposta #10 il: 13 Luglio 2015, 14:58:00 CEST »
0
In effetti in questo caso con un semplice ciclo avrebbe fatto 10 volte prima.

La richiesta è di non usare un ciclo for; evidentemente ci sono delle condizioni a contorno che lo impediscono.

Tra l'altro la funzione contains usa una ricerca lineare,  quindi non c'è alcun guadagno di prestazioni.
Se l'array fosse già ordinato si potrebbe usare una ricerca binaria per velocizzare i tempi.

Vero, SE fosse ordinato. Non essendo specificato nella richiesta bisogna assumere che non lo sia.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

iClaude

  • Visitatore
Re:Search String in Array
« Risposta #11 il: 13 Luglio 2015, 15:06:02 CEST »
0
La richiesta è di non usare un ciclo for; evidentemente ci sono delle condizioni a contorno che lo impediscono.

Vero, SE fosse ordinato. Non essendo specificato nella richiesta bisogna assumere che non lo sia.

OK ma quali possono essere le ragioni che impediscono di usare un normale ciclo?
« Ultima modifica: 13 Luglio 2015, 15:08:37 CEST da iClaude »

Offline LinkOut

  • Utente normale
  • ***
  • Post: 269
  • Respect: +37
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:Search String in Array
« Risposta #12 il: 13 Luglio 2015, 15:34:56 CEST »
0
OK ma quali possono essere le ragioni che impediscono di usare un normale ciclo?

Nessuno iClaude, avrei potuto risolvere il problema in mille modi diversi tra cui i tuoi suggerimenti, però la mia domanda era chiara ed ha ricevuto risposta, quindi per me il problema è risolto.

PS: Non ho chiesto come sarebbe meglio fare ;)

Grazie.