【问题标题】:How to find duplicate string from an Array of String [duplicate]如何从字符串数组中找到重复的字符串[重复]
【发布时间】:2013-03-12 09:01:37
【问题描述】:

我有一个字符串数组,其中包含字符串列表。我想弄清楚这个列表中是否有任何重复的条目。基本上我有一个用户列表,应该没有重复的条目。

【问题讨论】:

标签: java


【解决方案1】:

您可以将字符串数组添加到 HashSet

Set<String> h = new HashSet<String>(Arrays.asList(new String[] { "a", "b" }));

这将为您提供唯一的字符串值。如有必要,将 HashSet 转换回数组

String[] uniqueValues = h.toArray(new String[0]);

【讨论】:

    【解决方案2】:

    如果您需要独特的东西,那么我们在 java 中有 Set

      String[] users = "User1,User2,User1,User,User".split(",");
    
            Set<String> uniquUsers = new HashSet<String>();
    
            for (int i = 0; i < users.length; i++) {
                if (!uniquUsers.add(users[i]))
                    users[i] = "Duplicate"; // here I am assigning Duplicate instead if find duplicate
                                            // you can assign as null or whatever you want to do with duplicates.
            }
            System.out.println(Arrays.toString(users));
    

    【讨论】:

      【解决方案3】:

      将它们全部添加到一个集合中,您将获得唯一的用户。然后将其转换回数组。

      【讨论】:

        【解决方案4】:

        按字母顺序排序。如果任何两个相邻条目相同,则您找到了重复项。

        【讨论】:

        • 你能分享代码吗?我是 Java 新手。
        • 对字符串进行排序会消耗额外的资源。尝试找到它不这样做的算法。
        • 为什么要先排序?它更快还是它有什么用途?只是一分钱。
        • 因为使用排序数组要快得多。假设您要检查重复并添加用户,那么您将获得 O(1) + O(N) 用于未排序和 O(lgN) + O(lgN) 用于排序数组。您必须花一些时间进行初始排序,但快速检查的好处会超过它。
        【解决方案5】:

        如果您想检查是否添加新用户,您只需遍历数组并在每个现有用户上使用 username.equals(*)

        如果您有一个包含重复条目的数组,只需为您拥有的每个用户运行此算法。

        这些都是粗略的方法,针对这个问题有很多优化。

        【讨论】:

          【解决方案6】:

          正如你提到的,不应该有重复的条目,所以最好在添加新用户之前迭代整个数组,而不是添加然后检查重复项。 前一种解决方案将在 O(N) 中解决。

          【讨论】:

          • O(N) per user 这与首先添加并在之后搜索重复项一样快...
          • 如果集合没有准备好,那么搜索副本的速度将比 O(N) 慢。但如果它至少是排序的,你可以在 O(lgN) 中添加新用户。
          • @Chechulin 在你所说的未准备好的集合中是什么意思?因为只有一个输入可以比较,所以在最坏的情况下不应该超过 O(N)。
          • @Heuster 是的,但是如果不知道新添加结果的索引,那么在这种情况下它不会是 O(n),而是 n2。此外,第一次添加然后删除唯一键元素并不是一个好的设计。
          • @ay89 我的评论针对 Heuster 的回复,描述了在添加新用户之前检查现有用户比在添加用户后执行检查要好得多。顺便说一句,可以通过 O(NlgN) 操作来搜索重复项。
          【解决方案7】:

          Patashu 的 想法似乎是最简单的。您可以使用Arrays.sort() 轻松高效地对数组进行排序。

          如果你真的想搜索,你可能会使用Arrays.binarysearch() 方法之一。但它们也需要排序数组....对于数组中的每个元素(例如在索引 n 处),搜索部分 0...(n-1) 和还要搜索 (n+1)...(length-1) 部分,但如果您只与 n 相邻的一个元素进行比较,那将是非常浪费的。所以又回到了之前的建议。

          如果您想稍微减少编码,可能以牺牲速度为代价,您可以使用AbstractCollection 的实现类之一的contains() 方法 - 可能是ArrayList(可以包含重复项),@987654326 @(已排序,包含唯一值)或 HashSet(未排序,包含唯一值)。您可以使用参数Arrays.asList(yourArray) 调用这些集合的构造函数,因此您无需逐个填充。

          正如 ay89 正确提到的,拥有一个具有唯一值的数组(换句话说,一个集合)更简单,然后在尝试添加之前检查您的值是否已经包含在内。让事情变得简单多了。但你可能并不总是能享受得到的东西。

          【讨论】:

            【解决方案8】:

            创建一个数组 news_data 并在其中添加字符串。

            for (int i = 0; i < news_data.length; i++) {
                            for (int j = i+1; j < news_data.length; j++) {
                                if(news_data[i].equals(news_data[j])){
                                    news_data = removeElement(news_data, j);
                                }
                            }
                        }
               public static String[] removeElement(String[] original, int element){
                    String[] n = new String[original.length - 1];
                    System.arraycopy(original, 0, n, 0, element );
                    System.arraycopy(original, element+1, n, element, original.length - element-1);
                    return n;
                }
            

            【讨论】:

              【解决方案9】:

              很简单,使用 LINQ 查找列表中的重复项。

              【讨论】:

              • 甲骨文和微软从什么时候开始握手的?
              猜你喜欢
              • 2013-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-02-22
              • 1970-01-01
              • 2018-05-01
              • 2016-07-08
              相关资源
              最近更新 更多