2012-05-07 23 views
5

Mi maestra solicitó específicamente que dividiéramos una oración en palabras sin usar String.split(). Lo he hecho usando un Vector (que no hemos aprendido), un bucle while y subcadenas. ¿Cuáles son otras maneras de lograr esto? (preferiblemente sin usar Vectors/ArrayLists).¿Cómo puedo dividir una cadena en palabras en Java sin usar String.split()?

+0

¿Cuál es la declaración exacta del problema? ¿Simplemente enumera lo que no puedes usar? ¿Alguna otra pista? – Tudor

+5

No adquiera el hábito de usar Vector, ha sido reemplazado por ArrayList. –

+2

Si su maestra lo solicitó, él espera que ** USTED ** pueda hacerlo usted mismo y no pedirle a otros que lo hagan por usted. Creo que quiere que hagas algo usando el método 'indexOf (String, int)' de String. –

Respuesta

14

Creo que tu profesor es pidiéndole que procese la cadena usted mismo (sin utilizar ninguna otra biblioteca para hacerlo por usted). Compruebe si este es el caso: si puede usarlos, existen cosas como StringTokenizer, Pattern y Scanner para facilitar el procesamiento de cadenas.

De lo contrario ...

Tendrá una lista de separadores de palabras (tales como espacio, tabulación, período, etc ...) y luego recorrer la matriz, la construcción de una cadena de un carácter a la vez hasta que se golpea la palabra separador. Después de encontrar una palabra completa (ha encontrado un separador de palabras), guárdela en su estructura (o lo que sea necesario), restablezca la variable en la que está construyendo la palabra y continúe.

+1

Realmente no necesita una lista de separadores de palabras. Puedes usar 'Character.isWhitepace'. – trutheality

+0

'' string.split() '' le permite separar palabras que están delineadas con caracteres que no sean espacios en blanco, por lo que tendría sentido implementar una lista de separadores. –

+0

@trutheality ¿cómo podría tokenizar cadenas que tienen paréntesis, comas u otros caracteres impares que no son ni espacios en blanco ni caracteres de palabra (probablemente depende de cómo se escriba la especificación/asignación)? Podría ser más fácil/mejor implementarlo probando 'Character.isLetter' –

2

Puede utilizar java.util.Scanner.

1

O utilice un Pattern (también conocido como expresión regular) para intentar hacer coincidir las palabras.

4

Analizando la cadena carácter por carácter, copiando cada carácter en una nueva Cadena, y deteniéndolo cuando llegue a un carácter de espacio en blanco. Luego comience una nueva cadena y continúe hasta que llegue al final de la cadena original.

1
  • utilizar un escáner con Héctor (String)
  • expresiones regulares y combinar
  • StringTokenizer
  • iteración a ti mismo Char por carbón
  • recursiva iteración
2

Puede usar java.util.StringTokenizer para dividir un texto usando el delimitador deseado. El delimitador predeterminado es SPACE/TAB/NEW_LINE.

String myTextToBeSplit = "This is the text to be split into words."; 
StringTokenizer tokenizer = new StringTokenizer(myTextToBeSplit); 
while (tokinizer.hasMoreTokens()) { 
    String word = tokinizer.nextToken(); 
    System.out.println(word); // word you are looking in 
} 

Como alternativa también se puede utilizar java.util.Scanner

Scanner s = new Scanner(myTextToBeSplit).useDelimiter("\\s"); 
while(s.hasNext()) { 
System.out.println(s.next()); 
} 
s.close(); 
-3

También puede utilizar String.substring o charAt[].

1

Sin utilizar un Vector/List (y sin manualmente volver a poner en práctica su capacidad de cambiar el tamaño de ellos para su función), puede tomar ventaja de la simple observación de que una cadena de longitud N no puede tener más de (N+1)/2 palabras (en la división de enteros). Puede declarar una matriz de cadenas de ese tamaño, rellenarla de la misma manera que ocupó ese Vector, y luego copiar los resultados en una matriz del tamaño de la cantidad de palabras que encontró.

Así:

String[] mySplit(String in){ 
    String[] bigArray = new String[ (in.length()+1)/2 ]; 

    int numWords = 0; 
    // Populate bigArray with your while loop and keep 
    // track of the number of words 

    String[] result = new String[numWords]; 
    // Copy results from bigArray to result 

    return result; 
} 
1
public class MySplit { 

public static String[] mySplit(String text,String delemeter){ 
    java.util.List<String> parts = new java.util.ArrayList<String>(); 
    text+=delemeter;   

    for (int i = text.indexOf(delemeter), j=0; i != -1;) { 
     parts.add(text.substring(j,i)); 
     j=i+delemeter.length(); 
     i = text.indexOf(delemeter,j); 
    } 


    return parts.toArray(new String[0]); 
} 

public static void main(String[] args) { 
    String str="012ab567ab0123ab"; 
    String delemeter="ab"; 
    String result[]=mySplit(str,delemeter); 
    for(String s:result) 
     System.out.println(s); 
} 

} 
0

Inténtelo esto.

public static String[] mysplit(String mystring) { 

    String string=mystring+" ";    //append " " bcz java string does not hava any ending character 
    int[] spacetracker=new int[string.length()];// to count no. of spaces in string 
    char[] array=new char[string.length()];  //store all non space character 
    String[] tokenArray=new String[string.length()];//to return token of words 

    int spaceIndex=0; 
    int parseIndex=0; 
    int arrayIndex=0; 
    int k=0; 
    while(parseIndex<string.length()) 
    { 
     if(string.charAt(parseIndex)==' '||string.charAt(parseIndex)==' ') 
     { 
      spacetracker[spaceIndex]=parseIndex; 
      spaceIndex++; 
      parseIndex++; 
     }else 
     { 
     array[arrayIndex]=string.charAt(parseIndex); 
     arrayIndex++; 
     parseIndex++; 
     } 
    } 


    for(int i=0;i<spacetracker.length;i++) 
    { 
     String token=""; 
     for(int j=k;j<(spacetracker[i])-i;j++) 
     { 
      token=token+array[j]; 
      k++; 

     } 
     tokenArray[i]=token; 
     //System.out.println(token); 
     token=""; 

    } 
    return tokenArray; 
} 

Esperanza esto ayuda

2
import java.util.Arrays; 
public class ReverseTheWords { 

    public static void main(String[] args) { 
     String s = "hello java how do you do"; 
     System.out.println(Arrays.toString(ReverseTheWords.split(s))); 
    } 

    public static String[] split(String s) { 
     int count = 0; 
     char[] c = s.toCharArray(); 

     for (int i = 0; i < c.length; i++) { 
      if (c[i] == ' ') { 
       count++; 
      } 
     } 
     String temp = ""; 
     int k = 0; 
     String[] rev = new String[count + 1]; 
     for (int i = 0; i < c.length; i++) { 
      if (c[i] == ' ') { 
       rev[k++] = temp; 
       temp = ""; 
      } else 
       temp = temp + c[i]; 
     } 
     rev[k] = temp; 
     return rev; 
    } 

} 
+0

Esto funciona bien para dividir la cadena cuando encuentras el espacio –

1
public class sha1 { 
public static void main(String[] args) { 
    String s = "hello java how do you do"; 
    System.out.println(Arrays.toString(sha1.split(s))); 
} 
public static String[] split(String s) { 
    int count = 0; 
    char[] c = s.toCharArray(); 

    for (int i = 0; i < c.length; i++) { 
     if (c[i] == ' ') { 
      count++; 
     } 
    } 
    String temp = ""; 
    int k = 0; 
    String[] rev = new String[count + 1]; 
    for (int i = c.length-1; i >= 0; i--) { 
     if (c[i] == ' ') { 
      rev[k++] = temp; 
      temp = ""; 
     } else 
      temp = temp + c[i]; 
    } 
    rev[k] = temp; 
    return rev; 
} 

}

1

simple toque.! Mejora si quieres.

paquete com.asif.test;

public class {SplitWithoutSplitMethod

public static void main(String[] args) { 

    split('@',"[email protected]@handsome"); 
} 

static void split(char delimeter, String line){ 

    String word = ""; 
    String wordsArr[] = new String[3]; 

    int k = 0; 
    for(int i = 0; i <line.length(); i++){ 

     if(line.charAt(i) != delimeter){ 
      word+= line.charAt(i); 
     }else{ 
      wordsArr[k] = word; 
      word = ""; 
      k++;      
     } 
    } 
    wordsArr[k] = word; 
    for(int j = 0; j <wordsArr.length; j++) 
    System.out.println(wordsArr[j]); 

} 

}

0
import java.util.*; 
class StringSplit { 
    public static void main(String[] args) 
    { 
     String s="splitting a string without using split()"; 
     ArrayList<Integer> al=new ArrayList<Integer>();  //Instead you can also use a String 
     ArrayList<String> splitResult=new ArrayList<String>(); 
     for(int i=0;i<s.length();i++) 
      if(s.charAt(i)==' ') 
       al.add(i); 
     al.add(0, 0); 
     al.add(al.size(),s.length()); 
     String[] words=new String[al.size()]; 
     for(int j=0;j<=words.length-2;j++) 
       splitResult.add(s.substring(al.get(j),al.get(j+1)).trim()); 
     System.out.println(splitResult); 
    } 
} 

Complejidad de tiempo: O (n)

Cuestiones relacionadas