2010-04-21 19 views
30

Sono curioso di sapere perchè il String.indexOf restituisce un 0 (invece di -1) quando si chiede per l'indice di una stringa vuota all'interno di una stringa.Java String.IndexOf e vuoti stringhe

L'Javadocs dire solo questo metodo restituisce l'indice in questa stringa della stringa specificata, -1 se la stringa non viene trovato.

Per me questo comportamento sembra altamente inaspettato, mi sarei aspettato un -1. Qualche idea sul perché questo comportamento inaspettato stia succedendo? Vorrei almeno che questo vale la pena di una nota nella Javadocs del metodo di ...

System.out.println("FOO".indexOf("")); // outputs 0 wtf!!! 
System.out.println("FOO".indexOf("bar")); // outputs -1 as expected 
System.out.println("FOO".indexOf("F")); // outputs 0 as expected 
System.out.println("".indexOf("")); // outputs 0 as expected, I think 
+1

Sì, e qual è la domanda? –

+1

'" foo ".indexOf (" ")' restituisce 0 e '" foo ".substring (0.0)' restituisce '" "'. Sembra coerente, direi. –

+0

possibile duplicato di http://stackoverflow.com/questions/2568625/indexof-method-returns-0-when-it-should-had-return-1-in-c-java –

risposta

89

La stringa vuota è ovunque, e da nessuna parte. È all'interno di tutte le stringhe in ogni momento, permeando l'essenza del loro essere, eppure mentre lo cerchi non lo capirai mai.

Quante stringhe vuote si possono inserire all'inizio di una stringa? Mu

Lo studente ha detto l'insegnante,

Maestro, credo che ho trovato la natura della stringa vuota. La corda vuota è come una particella di polvere, e fluttua liberamente attraverso una corda mentre la polvere fluttua liberamente attraverso la stanza, luccicante sotto un raggio di sole.

L'insegnante ha risposto allo studente,

Hmm. Una buona idea. Ora dimmi, dov'è la polvere, e dov'è la luce del sole?

L'insegnante ha colpito lo studente con una cinghia e gli ha insegnato a continuare la meditazione.

+3

Abbiamo seriamente bisogno di più utenti come te su SO. Ho letto una delle tue risposte su un post correlato e mi sono scomposto negli ultimi 10 minuti da altre risposte sul tuo profilo. Ben fatto, Maestro Zen. – JWiley

+0

Ma come si conta il numero di angeli che possono danzare all'interno della stringa vuota? –

+0

Amo questo. Non dimenticherò mai una risposta come questa. – racl101

24

Beh, se ti aiuta, si può pensare di "FOO" come "" + "FOO".

+4

Infatti, la stringa vuota può essere trovata tra due caratteri adiacenti in una stringa e all'inizio e alla fine. La prima istanza di questo tipo è l'inizio della stringa, ovvero la posizione 0. – Joey

+0

Quante volte la stringa vuota si verifica in "FOO"? – Armand

+0

@Ali: ∞ + 1, direi. – Joey

0

Utilizzando l'espressione "", si sta effettivamente facendo riferimento a una stringa nulla. Una stringa nulla è un tag etereo posto su qualcosa che esiste solo per mostrare che c'è una mancanza di qualcosa in questa posizione.

Quindi, dicendo "" .indexOf (""), in realtà chiedono l'interprete:

Da dove viene un valore stringa di null esiste nel mio stringa nulla?

Restituisce uno zero, poiché il valore nullo si trova all'inizio della stringa nulla inesistente.

aggiungere qualcosa alla stringa sarebbe ora fare una stringa non nulla ... nulla può essere pensato come l'assenza di tutto, anche nulla.

+0

Quindi qual è la differenza tra una "stringa nulla" e "null"? Non diciamo "stringa vuota" piuttosto che "stringa nulla" specificamente per evitare confusione con 'null'? – nnnnnn

+0

Dai un'occhiata a questa spiegazione: http://stackoverflow.com/questions/4802015/difference-between-null-and-java-string – exoboy

0

Utilizzando un approccio algebrico, "" è l'elemento neutro della concatenazione di stringhe: x + "" == x e "" + x == x (sebbene + non sia commutativo qui).

Poi si deve anche essere:

x.indexOf (y) == i and i != -1 
<==> x.substring (0, i) + y + x.substring (i + y.length()) == x 

quando y = "", questo vale se i == 0 e x.substring (0, 0) == "". Non ho progettato Java, ma immagino che i matematici abbiano partecipato a questo ...

1

int number_of_empty_strings_in_string_named_text = text.length() + 1

Tutti i caratteri sono separati da un vuoto String. Inoltre vuoto String è presente all'inizio e alla fine.

+0

Ora vedo che la stessa descrizione è nel commento di Joey, ma comunque penso che sia una buona idea per inserire questo in una nuova risposta, perché questa è l'unica risposta che spiega davvero come funziona. @ Joey se vuoi mettere questa risposta come tua e cancellare la mia per favore fammi sapere perché eri prima con quello. – ctomek

Problemi correlati