删除字符串数组中的重复字符串

23

我正在用Java进行基于字符串处理的程序设计,需要从字符串数组中删除重复的字符串。在此程序中,所有字符串的大小都相同。

'array'是一个字符串数组,其中有许多相似的字符串。使用以下代码应该可以去除重复的字符串,但实际上却没有去除。

如何去除重复的字符串?

我正在使用下面的代码:

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

你现在的代码有什么问题? - Andy
3
为什么不使用更适合去重的结构,比如 HashSet,而是使用数组呢? - assylias
15个回答

45

这将有效

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

或者只需使用 HashSet 而不是数组。


2
new String[0] 的目的是什么? - Stevoisiak
@Stevoisiak 这里有一个链接,解释了 new String[0] 的用法 https://dev59.com/tGMl5IYBdhLWcg3wyJUe#65902425 - experiment unit 1998X

8

2
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
                }
    } 
}

2

除非这是[作业],否则我会使用Set集合。

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

2
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

集合数据结构会自动完成这项工作。 对于您来说,最可能的选项是HashSet,如果您关心元素的顺序,请查看TreeSet

List<String> input = Arrays.asList(array);
Set<String> unique = new HashSet<>(input);

0
  • 为什么不使用String.equals()进行比较,而是手动遍历字符串中的字符?
  • 您的逻辑实际上是错误的:对于array[s] == "12345"array[m] == "123",它会认为它们相等。
  • 此外,在您的内部循环for(int m=0;m<array.length;m++)中,m 在某些时候也会变成等于s,因此您将比较一个字符串与自身。

这些注释假定您需要使用自己的代码来实现删除逻辑,而不允许使用类库。如果情况不是这样的,正如其他人所指出的,使用HashSet是最简单的方法。


0

为什么你没有用String.equals(String)代替最内层的循环?

在第一次迭代中,您将array [0]与array [0]进行比较,它们是相等的,因此将被删除。然后,您将原始array [1]与数组中的所有其他元素进行比较,如果它们相等,则会删除array [1](而不是另一个)。

存在一些问题,如果有一些重复的字符串,您将删除第一个字符串,这将减小数组的大小而不会减小r,因此跳过了数组中的一些字符串。

我会使用强制唯一性的数据结构,例如Set。

如果您的数组中有3个相等的字符串,会发生什么,我不确定会发生什么。

我相信您会遇到一些ArrayIndexOutOfBoundsException


0

我认为最后的 if 条件应该是 if(n==(array[m].length()-1))

话虽如此,您似乎正在尝试在最内层循环中实现 String.equals() 方法。


0
Sring[] myStringArray = {"hello", "hello", "moto"};
String[] filteredArray = new LinkedHashSet<String>(Arrays.asList(myStringArray))
                         .toArray(new String[0]);

System.out.println("filteredArray Size: " + filteredArray.length);
System.out.println("filteredArray[0] = " + filteredArray[0]);
System.out.println("filteredArray[1] = " + filteredArray[1]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接