从未排序的数组中删除重复项

时间:2015-10-25 21:21:04

标签: java sorting duplicates

我从某个给定的未排序数组中快速返回非重复数组的方法似乎只在某些时候有效:

    public static int[] removeDuplicates(int[] arr) {
    if (arr.length <= 1) {
        return arr;
    }

    int lastFound = arr[0];

    int currPos = 1;
    for (int i = 1; i < arr.length; ++i) {
        int num = arr[i];
        if (lastFound != num) {
            lastFound = num;
            arr[currPos++] = num;
        }
    }

    return Arrays.copyOf(arr, currPos);
}

当我输入时:

int[] arr = {0, 1, 1, 0, 1, 1, 2, 2}
int[] arr2 = removeDuplicates(arr);

它将返回:

arr2 = {0, 1, 0, 1, 2}

应该返回的地方(没有重复):

arr2 = {0, 1, 2}

3 个答案:

答案 0 :(得分:3)

为了确定是否要添加值,您只需查看前一个元素(或者更确切地说,是上一次运行的相等值中的第一个元素)。

这意味着它只有在具有给定值的所有元素在数组中是连续的时才起作用,对于您的示例输入它们不是。

e.g。它适用于

{0, 0, 1, 1, 2}  // Sorted.

{2, 0, 0, 1, 1}  // Unsorted, but all equal elements are together.

为了使其有效,您需要记录以前见过的所有元素,而不仅仅是上次运行开始时的那些元素,例如:通过将看到的元素存储在Set中。但是,假设将一个已存在的元素添加到集合中并不会更改集合,您也可以将整个数组添加到集合中:

LinkedHashSet<Integer> set = new LinkedHashSet<>(Arrays.asList(arr));

set.addAll(Arrays.asList(arr)); // If the set already exists.

如果您想要返回int[](而不是使用Integer[]可以获得的set.toArray(new Integer[])),则需要将元素复制回数组:

int[] result = new int[set.size()];
int idx = 0;
for (int value : set) {
  result[idx++] = value;
}
return result;

答案 1 :(得分:2)

处理问题的方法是记录迭代数组时出现在数组中的每个元素,并删除元素的重复项。记录元素是使用哈希表。

 public int[] removeDups(int[] data){
       Hashtable table = new Hashtable();
       ArrayList<int> arrayList= new ArrayList<int>(Arrays.asList(array));
       for(int i = 0; i < data.length; i++){
           if(table.containsKey(arrayList.get(i)){
          arrayList.remove(i);
      }else{
          table.put(arrayList.get(i),true);
      }
  }
  return arrayList.toArray();

}

这样,删除重复项就更容易了。

答案 2 :(得分:-1)

您可以使用一组整数,这将确保您只有唯一值

HashSet<Integer> set = new HashSet<Integer>();
for (int i = 1; i < arr.length; ++i) {
    set.add(arr[i]);
}
return set.toArray();

您的方法将使用排序数组,因此如果您使用合并排序进行排序 数组中的元素将采用O(n log n)最坏的情况,你可以遍历数组并排除任何与数组中前一项相同的项,从而产生一个只有唯一数字的数组。

public int[] removeDuplicates(int[] data) {
    // Make sure you have elemens in the array and it's not empty
    Arrays.sort(data);
    int number = data[0];
    ArrayList<Integer> result = new ArrayList<Integer>;
    for (int i = 1; i < data.length; ++i) {
        if (data[i] != number) {
            number = data[i];
            result.add(data[i]);
        }
    }

    result.toArray();
}