【发布时间】:2013-03-12 09:01:37
【问题描述】:
我有一个字符串数组,其中包含字符串列表。我想弄清楚这个列表中是否有任何重复的条目。基本上我有一个用户列表,应该没有重复的条目。
【问题讨论】:
-
改用set。
标签: java
我有一个字符串数组,其中包含字符串列表。我想弄清楚这个列表中是否有任何重复的条目。基本上我有一个用户列表,应该没有重复的条目。
【问题讨论】:
标签: java
您可以将字符串数组添加到 HashSet
Set<String> h = new HashSet<String>(Arrays.asList(new String[] { "a", "b" }));
这将为您提供唯一的字符串值。如有必要,将 HashSet 转换回数组
String[] uniqueValues = h.toArray(new String[0]);
【讨论】:
如果您需要独特的东西,那么我们在 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));
【讨论】:
将它们全部添加到一个集合中,您将获得唯一的用户。然后将其转换回数组。
【讨论】:
按字母顺序排序。如果任何两个相邻条目相同,则您找到了重复项。
【讨论】:
如果您想检查是否添加新用户,您只需遍历数组并在每个现有用户上使用 username.equals(*)。
如果您有一个包含重复条目的数组,只需为您拥有的每个用户运行此算法。
这些都是粗略的方法,针对这个问题有很多优化。
【讨论】:
正如你提到的,不应该有重复的条目,所以最好在添加新用户之前迭代整个数组,而不是添加然后检查重复项。 前一种解决方案将在 O(N) 中解决。
【讨论】:
Patashu 的 想法似乎是最简单的。您可以使用Arrays.sort() 轻松高效地对数组进行排序。
如果你真的想搜索,你可能会使用Arrays.binarysearch() 方法之一。但它们也需要排序数组....对于数组中的每个元素(例如在索引 n 处),搜索部分 0...(n-1) 和还要搜索 (n+1)...(length-1) 部分,但如果您只与 n 相邻的一个元素进行比较,那将是非常浪费的。所以又回到了之前的建议。
如果您想稍微减少编码,可能以牺牲速度为代价,您可以使用AbstractCollection 的实现类之一的contains() 方法 - 可能是ArrayList(可以包含重复项),@987654326 @(已排序,包含唯一值)或 HashSet(未排序,包含唯一值)。您可以使用参数Arrays.asList(yourArray) 调用这些集合的构造函数,因此您无需逐个填充。
正如 ay89 正确提到的,拥有一个具有唯一值的数组(换句话说,一个集合)更简单,然后在尝试添加之前检查您的值是否已经包含在内。让事情变得简单多了。但你可能并不总是能享受得到的东西。
【讨论】:
创建一个数组 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;
}
【讨论】:
很简单,使用 LINQ 查找列表中的重复项。
【讨论】: