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]);
}
}
Ça va marcher
array = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]);
ou utilisez simplement une HashSet
au lieu d'un tableau.
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
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);
}
}
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
}
}
}
Sauf s'il s'agit de [homework]
, j'utiliserais un ensemble
String[] array =
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array));
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.
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));
}
String.equals()
pour la comparaison au lieu de parcourir manuellement les caractères des chaînes? array[s]
== "12345"
et array[m]
== "123"
, ils prétendent être égaux.for(int m=0;m<array.length;m++)
m
deviendra également égal à s
à un moment donné, vous comparerez donc une chaîne à elle-mêmeCes 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.
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 ArrayIndexOutOfBoundsException
s.