2012-04-28 46 views
13

Estoy haciendo un programa basado en el procesamiento de cadenas en Java en el que necesito eliminar cadenas duplicadas de una matriz de cadenas. En este programa, el tamaño de todas las cadenas es el mismo.Eliminar cadenas duplicadas en matriz de cadenas

La 'matriz' que es una matriz de cadenas contiene una serie de cadenas en las que dos cadenas se parecen entre sí. Entonces, usando el siguiente código, la cadena duplicada debe eliminarse pero no se elimina.

¿Cómo eliminar las cadenas duplicadas?

Estoy usando el siguiente código.

for(int s=0;s<array.length-1;s++) 
    { 
     for(int m=0;m<array.length;m++) 
     { 
       for(int n=0;n<array[m].length();n++) 
       { 
        if(array[s].charAt(n)==array[m].charAt(n)) 
        { 
         continue; 
        } 
        else 
       break; 
     } 
     if(n==array[m].length()) 
     { 
      ArrayUtils.removeElement(array, array[s]); 
     } 
    } 
+0

¿Qué es exactamente mal con el código que tienes ahora? – Andy

+3

¿Por qué no utiliza una estructura más adecuada para eliminar duplicados, como un HashSet por ejemplo, en lugar de matrices? – assylias

+0

¿podría decirnos cuál es el código usando hashset? –

Respuesta

26

Esto funcionará

array = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]); 

o simplemente utilizar un HashSet lugar de una matriz.

+1

@ Garrett Hall ¿Se optimizará este enfoque? –

+3

¿Optimizado para qué? –

+2

Para 1 millón de usuarios de su futura puesta en marcha –

1
Set<String> set = new HashSet<String>(); 
Collections.addAll(set, array); 

o empezar con

for(int s=0;s<array.length-1;s++) 
{ 
    for(int m=s + 1;m<array.length;m++) 
    { 

       if(array[s] != null && array[s].equals(array[m])) 
       { 
        // array = ArrayUtils.removeElement(array, array[s]); --m;?? 
        array[m] = null; // Mark for deletion later on 
       } 
    } 
} 
2

A menos que esto es [homework] me gustaría utilizar un conjunto

String[] array = 
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array)); 
0
  • ¿Por qué no utilizar String.equals() para la comparación en lugar de iteración a través de los personajes en las cuerdas manualmente?
  • Su lógica es en realidad imperfecta, porque array[s] == == "12345" y array[m]"123" que pretenden pensar que no son iguales
  • por otra parte, en su bucle interno for(int m=0;m<array.length;m++)m también llegarán a ser igual a s en algún momento, por lo que se comparar una cadena consigo mismo

Estas notas asumen que debe implementar la lógica de eliminación con su propio código, no se le permite usar la biblioteca de clases. Si este no es el caso, como otros señalaron, usar el HashSet es el enfoque más simple.

0

¿Por qué no eliminaste el bucle interno más a favor de String.equals(String)?

En la primera iteración está comparando la matriz [0] con la matriz [0] que son iguales, y se eliminarían. Luego, comparará la matriz original [1] con todos los demás elementos de la matriz y, si son iguales, eliminará la matriz [1] (no la otra).

hay algunos problemas, si hay algunas cadenas duplicadas, va a extraer la primera de ellas, lo que reducirá el tamaño de la matriz sin reducir r así, algunos de los hilos en la matriz se omiten.

Usaría una estructura de datos que fuerce la unicidad, como un conjunto.

¿Qué pasará si tiene 3 cadenas iguales en su matriz, no estoy seguro de lo que sucederá.

Creo que se encontraría con algunos ArrayIndexOutOfBoundsException s.

0

creo que la condición si al final debe ser si (n == (array [m] .length() - 1))

Una vez dicho esto, que parece estar tratando de poner en práctica lo Cadena El método .equals() lo hace en su ciclo más interno.

-2

número entero duplicado Quitar: esta es la respuesta perfecta /// /// Haris

public static void duplicateRemove(int[] arr) { 
    int temp = 0; 

    for (int i = 0; i < arr.length; i++) { 
     for (int j = 0; j < arr.length; j++) { 
      if (arr[i] < arr[j]) { 
       temp = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = temp; 
      } 
     } 
    } 

    int count; 
    for (int j = 0; j < arr.length;) { 
     count = 1; 
     for (int i = j + 1; i < arr.length; i++) { 
      if (arr[i] == arr[j]) { 
       count++; 
      } else 
       break; 

     } 
     System.out.println(arr[j] + " is : " + count); 
     j += count; 
    } 

} 
+1

La cuestión está relacionada con la eliminación de cadenas dobles no enteros –

0
 String[] arr = {"w10","w20","w10","w30","w20","w40","w50","w50"}; 
    List<String> arrList = new ArrayList<String>(); 
    int cnt= 0; 
     //List<String> arrList = Arrays.asList(arr); 
     List<String> lenList = new ArrayList<String>(); 
      for(int i=0;i<arr.length;i++){ 
     for(int j=i+1;j<arr.length;j++){ 
      if(arr[i].equals(arr[j])){ 
      cnt+=1; 
      }     
     } 
     if(cnt<1){ 
      arrList.add(arr[i]); 
     } 
      cnt=0; 
     } 

for(int k=0;k<arrList.size();k++){ 
      System.out.println("Array without Duplicates: "+arrList.get(k)); 
     } 
Cuestiones relacionadas