我有一个字符串数组,其中包含字符串列表。我想弄清楚这个列表中是否有任何重复的条目。基本上我有一个用户列表,应该没有重复的条目。
9 回答
您可以将字符串数组添加到 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相邻的一个元素进行比较,那将是非常浪费的。所以又回到了之前的建议。
如果您想稍微减少编码,可能会以牺牲速度为代价,您可以使用以下contains()
实现类之一的方法AbstractCollection
- 可能ArrayList
(可以包含重复项)、TreeSet
(已排序,包含唯一值)或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 查找列表中的重复项。