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

Posted

技术标签:

【中文标题】删除字符串数组中的重复字符串【英文标题】:Delete duplicate strings in string array 【发布时间】:2012-05-09 03:49:33 【问题描述】:

我正在编写一个基于 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]);
        
    

【问题讨论】:

你现在得到的代码到底有什么问题? 为什么不使用更适合删除重复项的结构,例如 HashSet,而不是数组? 你能告诉我使用hashset的代码是什么吗? 【参考方案1】:

这会起作用

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

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

【讨论】:

new String[0]的目的是什么?【参考方案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
                
     

【讨论】:

【参考方案3】:

除非这是 [homework],否则我会使用 Set

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

【讨论】:

【参考方案4】: 为什么不使用String.equals() 进行比较,而不是手动遍历字符串中的字符? 您的逻辑实际上是有缺陷的:对于 array[s] == "12345"array[m] == "123" 它会声称它们是相等的 此外,在您的内部循环中,for(int m=0;m&lt;array.length;m++) m 在某些时候也将等于 s,因此您会将字符串与其自身进行比较

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

【讨论】:

【参考方案5】:

您为什么不删除最内部的循环以支持String.equals(String)

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

有一些问题,如果有一些重复的字符串,你正在删除第一个,这将减少数组的大小而不减少r所以,数组中的一些字符串被跳过了。

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

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

相信你会遇到一些ArrayIndexOutOfBoundsExceptions。

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

重复整数删除:这是完美的答案 /// 哈里斯 ///

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;
    


【讨论】:

问题是关于删除重复的字符串而不是整数【参考方案8】:
     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));
        

【讨论】:

【参考方案9】:

建议的解决方案不保持元素的顺序。如果您使用 Java 8 或更高版本并希望保持顺序,您可以按如下方式使用流:

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

完整示例:https://www.javacodeexamples.com/java-string-array-remove-duplicates-example/849

【讨论】:

【参考方案10】:
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);
    

【讨论】:

【参考方案11】:
List<String> al = new ArrayList<String>();
String[] months="Jan","Feb","Mar","Apr","Jan","Mar","May","May";
for(int i=0;i<months.length;i++)
    for(int j=1;j<months.length;j++)
        if(months[i].equalsIgnoreCase(months[j]))
            if(!al.contains(months[i]))
                al.add(months[i]);
            
        
    

【讨论】:

【参考方案12】:
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]);

【讨论】:

【参考方案13】:

设置数据结构将自动完成这项工作。 您最有可能的选择是HashSet,如果您关心元素的顺序,请查看TreeSet

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

【讨论】:

【参考方案14】:
public static List<String> sortHandleArrayList(String... arrayInput) 
    List<String> list = new ArrayList<>();
    for (String string : arrayInput) 
        if (!list.contains(string)) 
            list.add(string);
        
    
    Collections.sort(list);
    return list;

【讨论】:

【参考方案15】:

在不使用 Collection 的情况下从 String[] 中删除重复的字符串

    public static void removeDuplicate(String[] str, int size)
            for(int i=0; i<size-1; i++)
                if(str[i]!=null)
                    for(int j=i+1; j<size-1; j++)
                        if(str[i].equals(str[j]))
                            str[j]=null;
                        
                    
                
            
            for(int i=0; i<size;i++)
                if(str[i]==null)
                   continue;
                System.out.println(str[i]);
            
        

【讨论】:

以上是关于删除字符串数组中的重复字符串的主要内容,如果未能解决你的问题,请参考以下文章

Ruby - 遍历数组中的每个字符串并删除重复的字符

从数组中删除重复的对象

C语言,删除数组中的重复数字然后输出

删除数组中的重复项

最小栈(栈设计)删除有序数组中的重复项(数组双指针)最大数(贪心字符串)

C语言删除数组重复数字