我接受移动电话号码数组,并且需要删除该数组中的重复号码。我选择的方式是将数组转换为哈希集,然后将其转换回数组。有什么更好的方法吗?
我的代码如下:
public static void main (String[] args) {
String[] mobiles = new String[]{"1", "2", "3", "1", "1"};
Set<String> data = new HashSet<>(Arrays.asList(mobiles));
String[] result = data.toArray(new String[0]);
for (String s : result) {
System.out.println(s);
}
}
答案 0 :(得分:3)
您也可以使用Java8 Streams
。
public static void main(String []args){
String[] mobiles = new String[]{"1", "2", "3", "1", "1"};
String[] result= Arrays.stream(mobiles).distinct().toArray(String[]::new);
for (String s : result) {
System.out.println(s);
}
}
答案 1 :(得分:2)
最简单的方法是使用LinkedHashSet。这样,订单将被保留:
String[] nonUnique = new String[] { "1", "2", "5", "2", "3", "1" };
List<String> unique = new ArrayList<>(new LinkedHashSet<>(Arrays.asList(nonUnique)));
通常,我建议使用集合而不是数组。
答案 2 :(得分:0)
我更喜欢您当前的方法。在我的头顶上方,您可以尝试通过以下方法删除重复项:首先对数组进行排序,然后沿着数组走下去:
int[] mobiles = new int[] {1, 2, 3, 1, 1};
Arrays.sort(mobiles);
List<Integer> result = new ArrayList<>();
int last = -1;
for (int val : mobiles) {
if (val != last || result.size() == 0) {
result.add(val);
last = val;
}
}
mobiles = new int[result.size()];
for (int i=0; i < result.size(); ++i) {
mobiles[i] = result.get(i);
}
System.out.println(Arrays.toString(mobiles));
[1, 2, 3]
此答案假设您不想保留数组中的原始顺序。当然,只有在定义了要保留的重复项之后,“原始”顺序才有意义。
上述方法的性能瓶颈取决于对数组进行排序的成本。假设可以在O(n*lgn)
中完成,那么这就是整体性能。
答案 3 :(得分:0)
您也可以使用哈希映射来解决这一问题。存储所有不同的元素。
Hashmap<Integer,Integer> hm = new Hashmap<>();
for(int i=0;i<arr.length;i++)
{
hm.add(arr[i],1);
}
Now print the hashmap.