Ответ 1
Это будет работать
array = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]);
или просто используйте HashSet
вместо массива.
Я делаю программу на основе строковой обработки на Java, в которой мне нужно удалить повторяющиеся строки из массива строк. В этой программе размер всех строк одинаковый.
"массив", который представляет собой строковый массив, содержит несколько строк, в которых две строки похожи друг на друга. Поэтому, используя приведенный ниже код, дублирующаяся строка должна быть удалена, но она не будет удалена.
Как удалить повторяющиеся строки?
Я использую следующий код.
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]);
}
}
Это будет работать
array = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]);
или просто используйте HashSet
вместо массива.
Если это не [homework]
, я бы использовал Set
String[] array =
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array));
Set<String> set = new HashSet<String>();
Collections.addAll(set, array);
или начните с
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
}
}
}
String.equals()
для сравнения, а не итерации через символы в строках вручную?array[s]
== "12345"
и array[m]
== "123"
она будет утверждать, что они равныfor(int m=0;m<array.length;m++)
m
в какой-то момент станет равным s
, поэтому вы сравните строку с самим собойЭти примечания предполагают, что вам необходимо реализовать логику удаления с помощью собственного кода, а не разрешено использовать библиотеку классов. Если это не так, как отмечали другие, использование HashSet
является самым простым подходом.
Почему вы не удалили самый внутренний цикл в пользу String.equals(String)
?
В первой итерации вы сравниваете массив [0] с массивом [0], которые равны, и он будет удален. Затем вы сравните исходный массив [1] со всеми остальными элементами в массиве, и если они равны, вы удалите массив [1] (а не другой).
Есть некоторые проблемы, если есть несколько повторяющихся строк, вы удаляете первый, что уменьшит размер массива без уменьшения r
, поэтому некоторые из строк в массиве пропущены.
Я бы использовал структуру данных, которая создает уникальность, например Set.
Что произойдет, если в вашем массиве 3 одинаковых строки, я не уверен, что произойдет.
Я думаю, вы столкнулись с некоторыми ArrayIndexOutOfBoundsException
s.
Я думаю, что условие if в конце должно быть если (п == (массив [м].length() - 1))
Сказав это, вы, похоже, пытаетесь реализовать метод String.equals() в своем внутреннем большинстве циклов.
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));
}
Дублировать целое удаление: это идеальный ответ /// Харис///
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;
}
}