2009-05-19 10 views
7

Non capisco perché Java [metodo String.substring()] (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#substring(int,%20int%29) sia specificato nel modo in cui è. Non posso dire di iniziare in una posizione numerata e restituire un numero specificato di caratteri; Devo calcolare Se si specifica una posizione finale oltre la fine della stringa, invece di restituire il resto della stringa per me, Java genera un'eccezioneCome dovrebbe funzionare la sottostringa()?

Sono abituato alle lingue in cui la sottostringa() (o substr()) prende due parametri: una posizione iniziale e una lunghezza.E 'obiettivamente migliore del modo in cui lo fa Java, e in caso affermativo, puoi dimostrarlo? Qual è la migliore specifica della lingua per la sottostringa() che hai visto, e quando mai sarebbe una buona idea per un linguaggio fare le cose in modo diverso? È IndexOutOfBoundsException che Java getta una buona idea di design, o no? tutto questo è appena arrivato alle preferenze personali?

+2

E 'davvero una questione di preferenze personali, che è ciò che rende questo "Soggettivo e argomentativo". Ho bisogno sia della "lunghezza" che della "fine" della sottostringa in momenti diversi, quindi per me non ha senso dire che uno è "migliore" dell'altro. –

+2

Non c'è bisogno di argomenare semplicemente perché è soggettivo. Sheesh. Non possiamo parlare dei meriti relativi delle decisioni linguistiche senza avere una guerra santa? Se Jon Skeet pensa che valga la pena di rispondere e non è solo un invito a discutere, sicuramente questo significa qualcosa? – skiphoppy

+1

Se lo modifico per eliminare le parole "stupito" e "inconveniente", sembrerà meno polemico, dal momento che nessuno ha mai sostenuto? Le domande sulla progettazione della lingua (che nella maggior parte dei casi implicano alcuni compromessi soggettivi) non sono appropriate per Stack Overflow? – skiphoppy

risposta

1

Se si leave off the 2nd parameter si andrà alla fine della stringa per te senza che tu debba calcolarlo.

+0

A volte vuoi da x a 20 caratteri dopo o alla fine della stringa, a seconda di quale dei due è più breve. – Yishai

+1

E a volte si desidera da x fino a metà del resto della stringa, escluse le cifre. Nessuna API può soddisfare tutti i requisiti possibili. –

+1

Nessuna API può soddisfare tutti i requisiti possibili, ma penso che alcune API possano dimostrare in modo dimostrabile più requisiti di altri. Ci sto ancora riflettendo e osservando le risposte. :) – skiphoppy

3

secondo parametro dovrebbe essere facoltativo, primo parametro dovrebbe accettare valori negativi ..

5

Sono abituato alle lingue in cui substring() (o substr()) accetta due parametri: una posizione di partenza, e una lunghezza . Questo è oggettivamente migliore rispetto al modo in cui lo fa Java, e in tal caso, puoi provarlo?

No, non è oggettivamente migliore. Tutto dipende dal contesto in cui si desidera utilizzarlo. Se vuoi estrarre una sottostringa di una lunghezza specifica, è cattiva, ma se vuoi estrarre una sottostringa che termini, per esempio, la prima occorrenza di "." nella stringa, è meglio che se prima dovessi calcolare una lunghezza. La domanda è: quale requisito è più comune? Direi quest'ultimo. Ovviamente, la soluzione migliore sarebbe avere entrambe le versioni nell'API, ma se hai bisogno di una versione basata sulla lunghezza tutto il tempo, usare un metodo di utilità statica non è così orribile.

Per quanto riguarda l'eccezione, sì, questo è sicuramente un buon design. Hai chiesto qualcosa di specifico, e quando non riesci a ottenere quella cosa specifica, l'API non dovrebbe cercare di indovinare cosa invece potresti volere - in questo modo, i bug diventano più velocemente visibili.

Inoltre, Java ha un metodo alternative substring() che restituisce la sottostringa da un indice iniziale fino alla fine della stringa.

9

Ci sono momenti in cui il secondo parametro è una lunghezza è più conveniente, e ci sono momenti in cui il secondo parametro è "l'offset da arrestare prima" è più conveniente. Allo stesso modo ci sono momenti in cui "se ti do qualcosa di troppo grande, vai alla fine della stringa" è conveniente, e ci sono momenti in cui indica un bug e dovrebbe davvero generare un'eccezione.

Il secondo parametro è una lunghezza utile se hai una lunghezza di campo fissa.Per esempio:

// C# 
String guid = fullString.Substring(offset, 36); 

Il secondo parametro da un offset è utile se si sta andando ad un altro delimitata:

// Java 
int nextColon = fullString.indexOf(':', start); 
if (start == -1) 
{ 
    // Handle error 
} 
else 
{ 
    String value = fullString.substring(start, nextColon); 
} 

In genere, quello che si desidera utilizzare è l'opposto di quello che è fornito sulla tua attuale piattaforma, nella mia esperienza :)

+4

+1 per quest'ultima frase. :) – jmucchiello

+0

+1, per lo stesso motivo. –

+0

+1. Stessa ragione. –

1

Dopo aver ottenuto un feedback, vedo quando lo scenario secondo parametro come indice è utile, ma finora tutti questi scenari sembrano funzionare in un'altra lingua/Limitazioni API. Ad esempio, l'API non fornisce una comoda routine per darmi le stringhe prima e dopo i primi due nella stringa di input, quindi ottengo invece l'indice di String e la sottostringa di chiamata(). (E questo spiega perché il secondo parametro di posizione in substr() supera l'indice desiderato di 1, IMO.)

Mi sembra che con un insieme più completo di funzioni di elaborazione delle stringhe nel toolkit del linguaggio, il secondo- lo scenario parameter-as-index perde a second-parameter-as-length. Ma per favore qualcuno mi mandi un controesempio. :)

+0

"Ad esempio, l'API non fornisce una comoda routine per darmi le stringhe prima e dopo i primi due nella stringa di input, quindi ottengo invece l'indice di String e la sottostringa di chiamata()." - Se si desidera che un'API faccia tutto, avremmo enormi API da imparare e Stack Overflow consisterebbe in risposte che chiedono perché qualcuno non ha usato uno dei 30000 metodi sull'oggetto String invece di utilizzarlo per 30 secondi. Ecco perché siamo programmatori, perché non tutto è stato ancora scritto. Se hai bisogno di fare molto X compito, scrivi la tua libreria per farlo. –

+0

Perché nel mondo tutti vorremmo scrivere la propria libreria quando potrebbero avere un unico debug di implementazione per tutti gli errori di fencepost? – skiphoppy

0

Se si memorizza questa via, il problema dovrebbe smettere affligge i tuoi sogni e ti finalmente ottenere un buon riposo notturno:

public String skipsSubstring(String s, int index, int length) { 
    return s.subString(index, index+length); 
} 
+0

Questo farà saltare in aria una IndexOutOfBoundsException. :) Avrei bisogno di aggiungere un controllo per rendere il secondo parametro a substring() essere min (index + length, s.length()). – skiphoppy

+0

Dopo aver esaminato l'implementazione di String, sembra che non sarebbe troppo difficile per Java fornire entrambi i paradigmi: substring() può continuare così com'è, e substr() potrebbe seguire la semantica più comune in altri linguaggi. Internamente l'implementazione sembra come se fosse semplice. – skiphoppy

+1

Penso che sarebbe terribile avere sia substring() che substr(), con semantica diversa.Posso praticamente garantire che userò quello sbagliato più della metà del tempo - e penso che anche la maggior parte dei miei colleghi programmatori lo farebbe. –