Autore Topic: Ricercare una stringa all'interno di una lista  (Letto 1090 volte)

Offline rekrux

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 7, Galaxy Tab 8.9
  • Sistema operativo:
    Windows 7, Ubuntu 11.4
Ricercare una stringa all'interno di una lista
« il: 03 Gennaio 2013, 16:27:30 CET »
0
Salve a tutti,
ho come obbiettivo la realizzazione di una applicazione che data una stringa x, inserita dall'utente, restituisce un'altra stringa y che ha una certa corrispondenza con quella inserita, e la stringa x viene confrontata con delle stringhe presenti all'interno di una lista.
Vorrei capire come gestire il confronto della stringa x inserita dall'utente con quelle presenti nella lista. Ho realizzato in java una piccola funzione in grado di eseguire questo confronto e mostrare il risultato, ma in android non so in che modo ottenere e gestire la stringa inserita nell'EditText().

Codice (Java): [Seleziona]
 
for(int i=0;i<list.size();i++){
      if(list.get(i).getNome().equalsIgnoreCase(NomeInserito)){
      System.out.println("The surname is "+list.get(i).getCognome());

Spero di essere stato chiaro nell'esporre il mio dubbio !
saluti
« Ultima modifica: 03 Gennaio 2013, 18:27:14 CET da rekrux »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ricercare di una stringa all'interno di una lista
« Risposta #1 il: 03 Gennaio 2013, 17:20:14 CET »
+1
per leggere il testo inserito dentro un EditText è sufficiente usare il metodo getText() e su questo chiamare il .toString().

Codice (Java): [Seleziona]
String NomeInserito = ilTuoEditText.getText().toString();

Offline rekrux

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 7, Galaxy Tab 8.9
  • Sistema operativo:
    Windows 7, Ubuntu 11.4
Re:Ricercare di una stringa all'interno di una lista
« Risposta #2 il: 03 Gennaio 2013, 18:23:01 CET »
0
ah okay  :-)  grazie! mentre gli elementi della lista, mi consigli di usare una ArrayList o un altra struttura dati?
Ogni elemento della lista è formato da due stringhe.

Offline RogoMantiK

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia Neo
Re:Ricercare una stringa all'interno di una lista
« Risposta #3 il: 06 Gennaio 2013, 20:55:35 CET »
0
Io ti consiglio di usare
Codice (Java): [Seleziona]
Vector<String> RESULTS = new Vector<String>();
in modo da poter usare poi .add
Di solito io faccio una cosa del genere
Codice (Java): [Seleziona]
final String parola = et_cerca.getText().toString();
int j = 0;
                        for (String tmp : MIO_ARRAY){
                                if (Pattern.compile(Pattern.quote(parola), Pattern.CASE_INSENSITIVE).matcher(tmp).find()){
                                        RESULTS.add(MIO_ARRAY[j]);
                                        }      
                                j++;
                                }
VALORI_UGUALI = RESULTS_A.toArray(new String[RESULTS_A.size()]); //array che contiene i valori uguali                  

L'array risultante conterrà anche i nomi che iniziano, finiscono e contengono la parola che inserisce. se non inserisce niente conterrà tutti i valori di MIO_ARRAY

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Ricercare di una stringa all'interno di una lista
« Risposta #4 il: 08 Gennaio 2013, 01:28:27 CET »
0
ah okay  :-)  grazie! mentre gli elementi della lista, mi consigli di usare una ArrayList o un altra struttura dati?
Ogni elemento della lista è formato da due stringhe.

Se fai sempre la ricerca sul nome per trovare il cognome (o più in generale sulla stringa x per trovare una stringa associata y)
ti conviene usare una HashMap, che permette di effettuare le ricerche molto più velocemente
(non viene fatta una scansione lineare dei dati, ma diciamo che si "salta" direttamente sul valore giusto).
in pratica per trovare un valore puoi fare direttamente una cosa tipo:
cognome=list.get(NomeInserito);
(magari dopo aver usato un toLowerCase sul nome da cercare e avendo memorizzato i nomi sempre in lower case)

Qui le info sulla struttura dati:
HashMap | Android Developers
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Ricercare di una stringa all'interno di una lista
« Risposta #5 il: 08 Gennaio 2013, 08:52:54 CET »
0
Se fai sempre la ricerca sul nome per trovare il cognome (o più in generale sulla stringa x per trovare una stringa associata y)
ti conviene usare una HashMap, che permette di effettuare le ricerche molto più velocemente
(non viene fatta una scansione lineare dei dati, ma diciamo che si "salta" direttamente sul valore giusto).
in pratica per trovare un valore puoi fare direttamente una cosa tipo:
cognome=list.get(NomeInserito);
(magari dopo aver usato un toLowerCase sul nome da cercare e avendo memorizzato i nomi sempre in lower case)

Qui le info sulla struttura dati:
HashMap | Android Developers
se usi un'hashmap sui nomi poi non puoi gestire i casi di omonimia... secondo me la cosa migliore è un db con i campi indicizzati...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Ricercare di una stringa all'interno di una lista
« Risposta #6 il: 08 Gennaio 2013, 12:26:57 CET »
0
se usi un'hashmap sui nomi poi non puoi gestire i casi di omonimia... secondo me la cosa migliore è un db con i campi indicizzati...
Sì, anche un db può essere una buona soluzione.
In realtà molto dipende dal contesto (ad esempio quanti sono i dati in gioco, quante volte la ricerca va fatta, se va fatta spesso e ci sono problemi di efficienza, come cambiano i dati nel tempo, se i dati sono temporanei, etc.).
Per cui alla fine solo rekrux può valutare le varie possibilità e scegliere la soluzione migliore per il suo caso specifico.

Comunque anche con una hashmap si possono gestire i casi di omonimia,
utilizzando una hash di liste, più precisamente con una cosa tipo:
HashMap<String, List<String>>
in cui ad ogni nome si associa una lista dei cognomi
 ;-)
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Ricercare di una stringa all'interno di una lista
« Risposta #7 il: 08 Gennaio 2013, 12:31:28 CET »
0
Sì, anche un db può essere una buona soluzione.
In realtà molto dipende dal contesto (ad esempio quanti sono i dati in gioco, quante volte la ricerca va fatta, se va fatta spesso e ci sono problemi di efficienza, come cambiano i dati nel tempo, se i dati sono temporanei, etc.).
Per cui alla fine solo rekrux può valutare le varie possibilità e scegliere la soluzione migliore per il suo caso specifico.

Comunque anche con una hashmap si possono gestire i casi di omonimia,
utilizzando una hash di liste, più precisamente con una cosa tipo:
HashMap<String, List<String>>
in cui ad ogni nome si associa una lista dei cognomi
 ;-)
si, ok, il caso medio è ok perchè i casi di omonimia sono pochi, ma non è una soluzione che mi aggrada molto, un'hashmap di string-list<String>, ok che ram ce n'è, ma buttarla via cosi....
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline rekrux

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 7, Galaxy Tab 8.9
  • Sistema operativo:
    Windows 7, Ubuntu 11.4
Re:Ricercare una stringa all'interno di una lista
« Risposta #8 il: 11 Gennaio 2013, 15:05:36 CET »
0
Ciao ragazzi
scusate del ritardo nella risposta al vostro aiuto ma sono stato un po' impegnato con l'università,
considerando che non dovrò aggiornare i dati e non dovrò gestire doppioni, la scelta di un db con indici sembra inizialmente la migliore.
Ma un hashmap è anche un buona soluzione visto che la ricerca ha costo O(1) se non ricordo male.
Il db dovrà gestire circa 200 tuple e l'unica operazione che verrà effettuata sarà la ricerca di uno dei due attributi che ogni oggetto possiede.
Dunque il costo della ricerca in un db indicizzato dovrebbe essere uguale a quello della ricerca in una lista concatenata e quindi O(n), facendo ricadere la scelta su una hashmap.
Questo ragionamento risulta valido secondo voi, o dovrei ragionare differentemente?  Le mie intenzioni sono comunque quelle di realizzare un software che non "consumi" troppo?
grazie per gli utili consigli.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Ricercare una stringa all'interno di una lista
« Risposta #9 il: 11 Gennaio 2013, 15:23:26 CET »
0
Ciao ragazzi
scusate del ritardo nella risposta al vostro aiuto ma sono stato un po' impegnato con l'università,
considerando che non dovrò aggiornare i dati e non dovrò gestire doppioni, la scelta di un db con indici sembra inizialmente la migliore.
Ma un hashmap è anche un buona soluzione visto che la ricerca ha costo O(1) se non ricordo male.
Il db dovrà gestire circa 200 tuple e l'unica operazione che verrà effettuata sarà la ricerca di uno dei due attributi che ogni oggetto possiede.
Dunque il costo della ricerca in un db indicizzato dovrebbe essere uguale a quello della ricerca in una lista concatenata e quindi O(n), facendo ricadere la scelta su una hashmap.
Questo ragionamento risulta valido secondo voi, o dovrei ragionare differentemente?  Le mie intenzioni sono comunque quelle di realizzare un software che non "consumi" troppo?
grazie per gli utili consigli.
secondo me, un'hash map ti costa di più, soprattutto in termini di memoria. Poi è vero che se sono 200 tuple non è granchè, però io userei comunque un db. Bisogna anche vedere il costo di inizializzazione dell'hash map (un db una volta fatto è fatto, l'hash map viene rifatta ad ogni avvio dell'app)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline rekrux

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 7, Galaxy Tab 8.9
  • Sistema operativo:
    Windows 7, Ubuntu 11.4
R: Ricercare una stringa all'interno di una lista
« Risposta #10 il: 11 Gennaio 2013, 19:01:18 CET »
0
Si, giusto l'hashmap ogni volta viene rigenerata.... Con un db, come dovrei comportarmi per fare i confronti tra x e y in termini di codice?

Inviato dal mio GT-P7300 con Tapatalk 2

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:R: Ricercare una stringa all'interno di una lista
« Risposta #11 il: 11 Gennaio 2013, 21:28:49 CET »
0
Si, giusto l'hashmap ogni volta viene rigenerata.... Con un db, come dovrei comportarmi per fare i confronti tra x e y in termini di codice?

Inviato dal mio GT-P7300 con Tapatalk 2
esiste l'operatore like che è anche più comodo del compare delle stringhe perchè ti permette di trovare anche i nomi simili tipo:
select * from PERSONE where nome like massim%
ti troverà:
massimo
massimiliano
ecc...
unico difetto il compare case insensitive non credo sia semplice, l'unica è che prima di inserire nel db i nomi li metti sempre toLowerCase() e poi prima della select fai il toLowerCase()
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline mdb

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +7
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    Prometheo Apps
  • Sistema operativo:
    Windows
Re:Ricercare una stringa all'interno di una lista
« Risposta #12 il: 13 Gennaio 2013, 21:17:51 CET »
0
Il db dovrà gestire circa 200 tuple e l'unica operazione che verrà effettuata sarà la ricerca di uno dei due attributi che ogni oggetto possiede.
Dunque il costo della ricerca in un db indicizzato dovrebbe essere uguale a quello della ricerca in una lista concatenata e quindi O(n), facendo ricadere la scelta su una hashmap.
La scelta dipende anche da quante ricerche devi fare, per ogni richiesta dell'utente.
Se ad ogni input dell'utente devi fare un'unica ricerca (o poco più) allora il db è senz'altro la soluzione migliore,
il programma ha tutto il tempo per trovare la risposta senza dover far aspettare l'utente.
E' inutile sovra-otimizzare (tenendo anche presente, come è stato fatto notare, che ciò comporta un ritardo iniziale per caricare le tuple)

Se invece a seguito di un singolo input dell'utente, devi fare una lunga elaborazione che comprende numerose ricerche sulle 200 tuple,
allora può convenire averle nella hash map.
 :-)
App per Android:
Almanacco: Giorno per giorno, eventi, notizie, giochi e curiosità, da leggere e condividere
Proverbi Napoletani: Più di 50 proverbi da ascoltare in dialetto napoletano. Due sottofondi musicali.