从数组中删除重复元素的最佳方法是什么?

时间:2019-04-11 05:18:08

标签: java

我接受移动电话号码数组,并且需要删除该数组中的重复号码。我选择的方式是将数组转换为哈希集,然后将其转换回数组。有什么更好的方法吗?

我的代码如下:

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);
    }
}

4 个答案:

答案 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.