Come faccio a dividere le stringhe in J2ME in modo efficace?Come dividere le stringhe in J2ME?
C'è un StringTokenizer
o String.split(String regex)
nell'edizione standard (J2SE), ma sono assenti nella versione micro (J2ME, MIDP).
Come faccio a dividere le stringhe in J2ME in modo efficace?Come dividere le stringhe in J2ME?
C'è un StringTokenizer
o String.split(String regex)
nell'edizione standard (J2SE), ma sono assenti nella versione micro (J2ME, MIDP).
Esistono alcune implementazioni di una classe StringTokenizer per J2ME. Questo uno per Ostermiller molto probabilmente includerà le funzionalità necessarie
Vedi anche this page on Mobile Programming Pit Stop per alcune modifiche e il seguente esempio:
String firstToken;
StringTokenizer tok;
tok = new StringTokenizer("some|random|data","|");
firstToken= tok.nextToken();
Grazie, era esattamente quello di cui avevo bisogno. – Spoike
link non funzionante per la libreria. Puoi fornire un lavoro. –
Non esiste un metodo integrato per dividere le stringhe. Devi scrivere da solo usando String.indexOf()
e String.substring()
. Non difficile.
Sì, ma la memoria sarà efficace? String.substring() creerà nuove stringhe, che manterranno la memoria fino alla raccolta dei dati inutili. – Spoike
StringTokenizer.nextToken() contiene "return string.subString (...)" internamente, quindi non penso che tu stia peggio ... – Cowan
La sottostringa usa un costrutto privato per String che condivide l'array di caratteri (immutabile) quindi sì, sarà efficiente in termini di memoria. Il collegamento – ddimitrov
Questo dipende da cosa esattamente si vuole raggiungere, ma la funzione String.substring() sarà da qualche parte:
String myString = "Hello World";
Questo stamperà la sottostringa a partire dall'indice 6 alla fine della stringa :
System.out.println(myString.substring(6));
Questo stamperà la sottostringa a partire dall'indice 0 fino Indice 5:
System.out.println(myString.substring(0,5));
.210
uscita di tutto il codice di cui sopra:
World Hello
Combinate questo con le altre funzioni di stringa (indexOf()
. ecc.) per ottenere l'effetto desiderato!
Rileggendo la tua domanda, sembra che stavi cercando String.split()
. In questo modo dividere la stringa di input in un array di stringhe basata su un dato regex:
String myString = "Hi-There-Gang";
String[] splitStrings = myString.split("-");
Questo si tradurrà nella matrice splitStrings che contiene tre archi, "Hi"
, "There"
e "Gang"
.
Rileggendo nuovamente la domanda, String.split
non è disponibile in J2ME, ma lo stesso effetto può essere ottenuto con substring
e indexOf
.
String.split (...) è disponibile in J2SE, ma non in J2ME.
È necessario scrivere il proprio algoritmo: related post with sample solution.
al momento non funziona più – Abdull
Spero che questo vi aiuterà a ... Questa è la mia propria implementazione i usato nella mia applicazione. Naturalmente questo può ancora essere ottimizzato. non ho tempo di farlo ... e inoltre, sto lavorando su StringBuffer qui. Basta refactarlo per poter usare String.
public static String[] split(StringBuffer sb, String splitter){
String[] strs = new String[sb.length()];
int splitterLength = splitter.length();
int initialIndex = 0;
int indexOfSplitter = indexOf(sb, splitter, initialIndex);
int count = 0;
if(-1==indexOfSplitter) return new String[]{sb.toString()};
while(-1!=indexOfSplitter){
char[] chars = new char[indexOfSplitter-initialIndex];
sb.getChars(initialIndex, indexOfSplitter, chars, 0);
initialIndex = indexOfSplitter+splitterLength;
indexOfSplitter = indexOf(sb, splitter, indexOfSplitter+1);
strs[count] = new String(chars);
count++;
}
// get the remaining chars.
if(initialIndex+splitterLength<=sb.length()){
char[] chars = new char[sb.length()-initialIndex];
sb.getChars(initialIndex, sb.length(), chars, 0);
strs[count] = new String(chars);
count++;
}
String[] result = new String[count];
for(int i = 0; i<count; i++){
result[i] = strs[i];
}
return result;
}
public static int indexOf(StringBuffer sb, String str, int start){
int index = -1;
if((start>=sb.length() || start<-1) || str.length()<=0) return index;
char[] tofind = str.toCharArray();
outer: for(;start<sb.length(); start++){
char c = sb.charAt(start);
if(c==tofind[0]){
if(1==tofind.length) return start;
inner: for(int i = 1; i<tofind.length;i++){ // start on the 2nd character
char find = tofind[i];
int currentSourceIndex = start+i;
if(currentSourceIndex<sb.length()){
char source = sb.charAt(start+i);
if(find==source){
if(i==tofind.length-1){
return start;
}
continue inner;
} else {
start++;
continue outer;
}
} else {
return -1;
}
}
}
}
return index;
}
btw, ecco come utilizzare il codice ... Stringa [] elements = split (new StringBuffer ("Hello | World"), "|"); o String [] elements = split (new StringBuffer ("HelloblahWorld"), "blah"); entrambi restituisce {"Ciao", "Mondo"} – demotics2002
public static Vector splitDelimiter(String text, char delimiter) {
Vector splittedString = null;
String text1 = "";
if (text != null) {
splittedString = new Vector();
for (int i = 0; i < text.length(); i++) {
if (text.charAt(i) == delimiter) {
splittedString.addElement(text1);
text1 = "";
} else {
text1 += text.charAt(i);
// if(i==text.length()-1){
// splittedString.addElement(text1);
// }
}
}
splittedString.addElement(text1);
}
return s
}
È possibile utilizzare questo metodo per suddividere un delimitatore.
In J2ME nessuna divisione, ma è possibile utilizzare questo codice per split.Questo codice funziona con solo 1 simbolo delimitatore !!! Usa NetBeans.File \ Crea progetto \ Java ME \ MobileApplication \ Imposta nome progetto (diviso) \ Imposta segno di spunta.Eliminare tutto il codice nel file (Midlet.java). Copiare questo codice e incollarlo nel (Midlet.java).
//IDE NetBeans 7.3.1
//author: UserSuperPupsik
//email: [email protected]
package split;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.util.Vector;
public class Midlet extends MIDlet {
public String e1;
public Vector v=new Vector();
public int ma;
int IsD=0;
int vax=0;
public String out[];
private Form f;
public void split0(String text,String delimiter){
if (text!=""){
IsD=0;
int raz=0;
//v.removeAllElements();
v.setSize(0);
int io;
String temp="";
int ni=(text.length()-1);
for(io=0;io<=ni;io++){
char ch=text.charAt(io);
String st=""+ch;
if(io==0 && st.equals(delimiter)){IsD=1;}
if(!st.equals(delimiter)){temp=temp+st;} //Not equals (!=)
else if(st.equals(delimiter)&&temp!="")//equals (==)
{
IsD=1;
//f.append(temp);
v.addElement(temp);
temp="";
}
if(io==ni && temp!="") {
v.addElement(temp);
temp="";
}
if((io==ni)&&IsD==0&&temp!=""){v.addElement(temp);}
}
if(v.size()!=0){
ma=(v.size());
out=new String[ma];
v.copyInto(out);
}
//else if(v.size()==0){IsD=1; }
}
}
public void method1(){
f.append("\n");
f.append("IsD: " +IsD+"");
if (v.size()!=0){
for(vax=0;vax<=ma-1;vax++){
f.append("\n");
f.append(out[vax]);
}
}
}
public void startApp() {
f=new Form("Hello J2ME!");
Display.getDisplay(this).setCurrent(f);
f.append("");
split0("Hello.World.Good...Luck.end" , ".");
method1();
split0(".",".");
method1();
split0(" First WORD2 Word3 "," ");
method1();
split0("...",".");
method1();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
elementi splited ubicata nella matrice chiamati (out) .Per Esempio out [1]: Ciao. Buona fortuna !!!
Un'altra soluzione alternativa:
public static Vector split(String stringToSplit, String separator){
if(stringToSplit.length<1){
return null;
}
Vector stringsFound = new Vector();
String remainingString = stringToSplit;
while(remainingString.length()>0){
int separatorStartingIndex = remainingString.indexOf(separator);
if(separatorStartingIndex==-1){
// Not separators found in the remaining String. Get substring and finish
stringsFound.addElement(remainingString);
break;
}
else{
// The separator is at the beginning of the String,
// Push the beginning at the end of separator and continue
if(remainingString.startsWith(separator)){
remainingString = remainingString.substring(separator.length());
}
// The separator is present and is not the beginning, add substring and continue
else{
stringsFound.addElement(remainingString.substring(0, separatorStartingIndex));
remainingString = remainingString.substring(separatorStartingIndex + separator.length());
}
}
}
return stringsFound;
}
Un po 'di una nota a margine, non aiuta con J2ME, ma potrebbe aiutare gli altri in futuro ... Purtroppo, StringTokenizer è stato sconsigliato in J2SE. La sostituzione suggerita è quella di utilizzare semplicemente il metodo Split split. Piuttosto sfortunato, StringTokenizer fatto per un bel codice slick. Cambiarlo per usare semplicemente il metodo Split split rende il codice più clunkier. Questo sembra essere il modo Java, deprecano le buone caratteristiche e dicono alle persone di usare solo quelle goffe. –