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