web-dev-qa-db-fra.com

Supprimer les chaînes en double dans le tableau de chaînes

Je crée un programme basé sur le traitement des chaînes de caractères en Java dans lequel je dois supprimer les chaînes en double d'un tableau de chaînes. Dans ce programme, la taille de toutes les chaînes est identique.

Le 'tableau' qui est un tableau de chaînes contient un certain nombre de chaînes dans lesquelles deux chaînes se ressemblent. Donc, en utilisant le code ci-dessous, la chaîne en double doit être supprimée mais elle ne l’est pas. 

Comment supprimer les doublons?

J'utilise le code suivant.

    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]);
        }
    }
16
user1339752

Ça va marcher

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

ou utilisez simplement une HashSet au lieu d'un tableau.

31
Garrett Hall

La solution proposée ne conserve pas l'ordre des éléments. Si vous utilisez Java 8 ou une version ultérieure et que vous souhaitez conserver l'ordre, vous pouvez utiliser les flux comme suit:

array = Arrays.stream(array).distinct().toArray(String[]::new);

Exemple complet: https://www.javacodeexamples.com/Java-string-array-remove-duplicates-example/849

1
import Java.util.*;
public class Stringarray {

    public static void main(String args[]){

        String[] name = {"aim","rajesh","raju","aim"};

    Set<String> myset  = new HashSet<String>();
    Collections.addAll(myset,name);

       System.out.println(myset);
    }
}
1
Set<String> set = new HashSet<String>();
Collections.addAll(set, array);

ou commencer par

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
                }
    } 
}
1
Joop Eggen

Sauf s'il s'agit de [homework], j'utiliserais un ensemble

String[] array =
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array));
1
Peter Lawrey

Je pense que la condition if à la fin devrait être If (n == (array [m] .length () - 1))

Cela dit, vous semblez essayer d'implémenter la méthode String.equals () dans votre boucle la plus interne.

0
Martin Prakash
     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));
        }
0
Janmejai
  • Pourquoi n'utilisez-vous pas String.equals() pour la comparaison au lieu de parcourir manuellement les caractères des chaînes? 
  • Votre logique est en fait erronée: pour array[s] == "12345" et array[m] == "123", ils prétendent être égaux.
  • de plus, dans votre boucle intérieure for(int m=0;m<array.length;m++)m deviendra également égal à s à un moment donné, vous comparerez donc une chaîne à elle-même

Ces notes supposent que vous devez implémenter la logique de suppression avec votre propre code, sans pouvoir utiliser la bibliothèque de classes. Si ce n’est pas le cas, comme d’autres l’ont fait remarquer, l’utilisation de HashSet est l’approche la plus simple.

0
Péter Török

Pourquoi n'avez-vous pas supprimé la boucle la plus interne avec en faveur de String.equals(String)?

Dans la première itération, vous comparez tableau [0] avec tableau [0] qui sont égaux, et il serait supprimé. Ensuite, vous comparerez le tableau d'origine [1] avec tous les autres éléments du tableau et, s'ils sont égaux, vous supprimez le tableau [1] (pas l'autre).

Il y a quelques problèmes, s'il y a des chaînes en double, vous supprimez la première, ce qui réduira la taille du tableau sans réduire r, de sorte que certaines des chaînes du tableau sont ignorées.

Je voudrais utiliser une structure de données qui force l'unicité, comme un ensemble.

Que se passera-t-il si vous avez 3 chaînes égales dans votre tableau, je ne suis pas sûr de ce qui se passera.

Je crois que vous rencontreriez des ArrayIndexOutOfBoundsExceptions.

0
Amir Pashazadeh