2012-04-28 6 views
13

Sto realizzando un programma basato sull'elaborazione di stringhe in Java in cui è necessario rimuovere le stringhe duplicate da un array di stringhe. In questo programma, le dimensioni di tutte le stringhe sono uguali.Elimina stringhe duplicate nell'array di stringhe

L''array' che è una matrice di stringhe contiene un numero di stringhe in cui due stringhe si assomigliano. Quindi usando il codice qui sotto la stringa duplicata deve essere rimossa ma non viene rimossa.

Come rimuovere le stringhe duplicate?

Sto usando il seguente codice.

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

Che cosa è esattamente sbagliato con il codice che hai ora? – Andy

+3

Perché non usi una struttura più adatta per rimuovere duplicati, come un HashSet per esempio, invece di matrici? – assylias

+0

potresti dirmi qual è il codice usando hashset? –

risposta

26

Ciò funzionerà

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

oppure utilizzare un HashSet invece che una matrice.

+1

@Garrett Hall Questo approccio sarà ottimizzato? –

+3

Ottimizzato per cosa? –

+2

Per 1 milione di utenti del suo futuro avvio –

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

o iniziare 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 meno che questo è [homework] vorrei usare un set

String[] array = 
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array)); 
0
  • Perché non si usa String.equals() per il confronto, invece di iterazione attraverso i personaggi nelle corde manualmente?
  • La logica è in realtà viziata: per array[s] == "12345" e array[m] == "123" sarebbe affermare che sono uguali
  • inoltre, nel ciclo interno for(int m=0;m<array.length;m++)m diventerà anche pari a s ad un certo punto, in modo da confrontare una stringa a se stessa

Queste note presumono che sia necessario implementare la logica di rimozione con il proprio codice, non essendo consentito l'uso della libreria di classi. Se questo non è il caso, come altri hanno notato, l'utilizzo di un HashSet è l'approccio più semplice.

0

Perché non è stato rimosso il ciclo più interno a favore di String.equals(String)?

Nella prima iterazione si confronta l'array [0] con l'array [0] che sono uguali e verrebbero rimossi. Quindi confronterai l'array originale [1] con tutti gli altri elementi dell'array e, se sono uguali, rimuovi l'array [1] (non l'altro).

Ci sono alcuni problemi, se ci sono alcune stringhe duplicate, si sta rimuovendo il primo, che ridurrà la dimensione della matrice senza ridurre r così, alcune delle stringhe nella matrice vengono saltate.

Vorrei utilizzare una struttura dati che impone l'unicità, ad esempio un set.

Cosa succederà se nella serie sono presenti 3 stringhe uguali, non sono sicuro di cosa accadrà.

Credo che si verifichino alcuni ArrayIndexOutOfBoundsException s.

0

penso che il caso condizione alla fine dovrebbe essere if (n == (array [m] .length() - 1))

Detto questo, ti sembra di essere cercando di attuare ciò che String Il metodo .equals() funziona nel tuo ciclo più interno.

-2

Duplicate intero remove: questa è la risposta perfetta /// /// 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 domanda riguarda la rimozione di STRINGS duplicati non interi –

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)); 
     }