Autore Topic: trim() non funziona  (Letto 1110 volte)

Offline LinkOut

  • Utente normale
  • ***
  • Post: 271
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
trim() non funziona
« il: 12 Novembre 2014, 13:45:34 CET »
0
Buongiorno,

Ho un'autocomplete textview del quale faccio:
Codice (Java): [Seleziona]
.getText().toString();
Volendo fare
Codice (Java): [Seleziona]
.getText().toString().trim();
funziona in debug, ma quando rilascio l'applicazione sembra che quel trim non venga più fatto...

Grazie.

Offline Nicola_D

  • 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:trim() non funziona
« Risposta #1 il: 12 Novembre 2014, 13:53:06 CET »
0
Ciao,
non dubito le tue capacità ma la cosa è impossibile :D
Dovresti verificare di non avere piu source folders per quella riga di codice (per la classe relativa in realtà) ed inoltre, ricorda che trim elimina i leading e trailing spaces, cioè quelli all'inizio e alla fine, non nel mezzo o tra i caratteri!
javadoc:
Citazione
Returns a copy of the string, with leading and trailing whitespace omitted.

Sicuro sicuro che non venga fatto? Magari mostralo in un toast o nel logcat mettendo qualche carattere chiave prima e dopo, tipo !|-_
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 LinkOut

  • Utente normale
  • ***
  • Post: 271
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:trim() non funziona
« Risposta #2 il: 12 Novembre 2014, 14:05:07 CET »
0
Grazie,
so come si comporta il trim() e che cosa fa. Lo stesso codice in AndroidStudio funziona in debug quindi fa il trim e non funziona in release.

EDIT: ho messo la stringa in un toast, non fa il trim, ci sono gli spazi. (a fine riga ovviamente)

PS: trim() funziona solo con il carattere Hex 20 della tabella ascii, solo ed esclusivamente quello. hmmm
« Ultima modifica: 12 Novembre 2014, 14:18:18 CET da LinkOut »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:trim() non funziona
« Risposta #3 il: 12 Novembre 2014, 21:22:58 CET »
0
Il carattere whitespace è appunto 0x20 e trim rimuove come da documentazione solo quello. Se vuoi un range di caratteri maggiori devi usare in modo intelligente le regular expressions.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline LinkOut

  • Utente normale
  • ***
  • Post: 271
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:trim() non funziona
« Risposta #4 il: 13 Novembre 2014, 09:55:03 CET »
0
Grazie per la risposta. Le limitazioni di trim() di java sono tante...

Non mi spiego come sia possibile che non rimuova gli whitespace... da una semplice autocomplete TextView....Infatti io vedo i caratteri 32(dec) = whitespace nella stringa, dopo il trim...

Offline Nicola_D

  • 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:trim() non funziona
« Risposta #5 il: 13 Novembre 2014, 09:58:34 CET »
0
Il carattere whitespace è appunto 0x20 e trim rimuove come da documentazione solo quello. Se vuoi un range di caratteri maggiori devi usare in modo intelligente le regular expressions.

Inviato dal mio Nexus 5 utilizzando Tapatalk
in teoria questa regex:
Citazione
^(\s*)(?:[\s\S]+)(\s*)$
dovrebbe fare quello che ti serve.
devi solo togliere i match dal gruppo 1 e 2, oppure cambiarla in:
Citazione
^(?:\s*)([\s\S]+)(?:\s*)$
e tenere solo il primo gruppo (1 o 0, non ricordo gli indici).

Prova e fammi sapere
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 LinkOut

  • Utente normale
  • ***
  • Post: 271
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:trim() non funziona
« Risposta #6 il: 13 Novembre 2014, 10:29:04 CET »
0
Ok ora provo con la regex. La cosa strana è che l'IDE mi fa vedere a video la stringa senza spazi... come se avesse fatto il trim...

In realtà però i CHAR di tale string contiene il 32(dec) che è lo spazio della tabella ascii...

Ecco un esempio:
Codice (Java): [Seleziona]
String ABC= autocomplete.getText().toString().trim();


Ho inserito nell'autocomplete "Stringa  " con due spazi.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:trim() non funziona
« Risposta #7 il: 13 Novembre 2014, 17:44:06 CET »
0
Forse non sai che le stringhe in Java sono molto diverse dalle stringhe in C e C++. Sono degli oggetti e hanno un limite massimo di lunghezza, la loro lunghezza è memorizzata nella proprietà "count".

Tu vedi il dump della memoria utilizzata per memorizzare la stringa, la quale coincide con la memoria interna della precedente stringa, ma l'oggetto è nuovo (le stringhe sono immutabili in Java) con la proprietà "count" ridotta dei caratteri whitespace trovati in fondo alla stringa. Si tratta di una ottimizzazione per non consumare altra memoria e per non copiare inutilmente i dati.

In altre parole quella stringa è lunga "count" caratteri, i caratteri nel buffer interno che vedi dopo non sono utilizzati.

Inviato dal mio Nexus 5 utilizzando Tapatalk
« Ultima modifica: 14 Novembre 2014, 10:15:24 CET da iceweasel »
adb logcat | tee /tmp/logcat | grep TAG

Offline LinkOut

  • Utente normale
  • ***
  • Post: 271
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:trim() non funziona
« Risposta #8 il: 14 Novembre 2014, 09:42:29 CET »
0
Perfetto, quindi la mia Stringa dovrebbe essere priva di spazi...

Eppure... un controllo di esistenza di un semplice Adapter, risulta che tale stringa contenga gli spazi...

Com'è possibile ciò?


Mi spiego meglio...
Ho un elenco di 10 persone.
Io inserisco "Giovanni  " <- Con due spazi.

il controllo per vedere se Giovanni è presente nell'elenco è il seguente
Codice (Java): [Seleziona]
(adapter.getPosition(nomePersona) != -1)Ovviamente nomePersona è una stringa a cui è stato applicato trim(); Quel controllo però, in una stringa contenenete spazi a cui è stato applicato il trim(); non funziona...

Questo perchè?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:trim() non funziona
« Risposta #9 il: 14 Novembre 2014, 10:12:34 CET »
0
Mancano dei dettagli, tipo la classe dell'oggetto "adapter" e quella "getPosition" è un tuo metodo?

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline LinkOut

  • Utente normale
  • ***
  • Post: 271
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:trim() non funziona
« Risposta #10 il: 14 Novembre 2014, 10:49:14 CET »
0
Hai ragione, scusa

Codice (Java): [Seleziona]
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
Pensavo fosse deducibile.

Post unito: 14 Novembre 2014, 12:13:59 CET
PS:



IDE: IntelliJ Idea

Come puoi notare anche tu, c'è qualcosa che non và...

In stringaPartenza è presente value = {char[9] <- il 9 è il numero di caratteri spazi compresi...

In stringaFinale è presente value = {char[4] <- il 4 è il numero di caratteri , Stringa finale è stringaPartenza.trim();

-----

Nell'esempio che ti ho riportato sopra di AndroidStudio ...value = {char[9] <- Il 9 è il numero dei caratteri contenenti lo spazio....

:/
« Ultima modifica: 14 Novembre 2014, 12:13:59 CET da LinkOut, Reason: Merged DoublePost »

Offline Nicola_D

  • 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:trim() non funziona
« Risposta #11 il: 14 Novembre 2014, 12:37:24 CET »
0
secondo me ti stai facendo un sacco di problemi, ma l'errore di fondo (senza vedere il codice è un mio pensiero) sta nella "getPostion"
se getPosition (metodo tuo o meno) fa un if (String1==String2) allora ecco il problema.
Tu devi fare una string1.equals(String2), altrimenti non sarà mai la stessa stringa (vedi i trace delle stringhe, sono @447 e @448, quindi non == )
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 LinkOut

  • Utente normale
  • ***
  • Post: 271
  • Respect: +38
    • Mostra profilo
  • Dispositivo Android:
    Xiaomi Mi5
Re:trim() non funziona
« Risposta #12 il: 17 Novembre 2014, 08:55:23 CET »
0
Codice (Java): [Seleziona]
    /**
     * Returns the position of the specified item in the array.
     *
     * @param item The item to retrieve the position of.
     *
     * @return The position of the specified item.
     */

    public int getPosition(T item) {
        return mObjects.indexOf(item);
    }

La mia era solo curiosità ^^

Vedrò di non usare più il getPosition