6

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

4

9 回答 9

9

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

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

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

String[] uniqueValues = h.toArray(new String[0]);
于 2013-03-12T09:13:07.987 回答
7

如果您需要独特的东西,那么我们在 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));
于 2013-03-12T09:16:35.377 回答
2

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

于 2013-03-12T09:06:50.597 回答
0

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

于 2013-03-12T09:03:43.983 回答
0

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

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

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

于 2013-03-12T09:06:39.873 回答
0

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

于 2013-03-12T09:14:28.090 回答
0

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

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

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

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

于 2013-03-12T09:28:57.727 回答
0

创建一个数组 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;
    }
于 2013-03-12T09:29:26.897 回答
-3

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

于 2013-03-12T09:04:01.347 回答