【问题标题】: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的代码是什么吗?

标签: java arrays string-matching


【解决方案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]);
                                      }
                                  }
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2018-06-09
                            • 1970-01-01
                            • 1970-01-01
                            • 2013-11-12
                            • 1970-01-01
                            • 2017-12-30
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多