Java程序从数组中删除重复的元素

时间:2020-01-09 10:35:36  来源:igfitidea点击:

这篇文章展示了从Java中删除数组中重复元素的各种方法。我们拥有的选项如下

  • 通过传递数组来创建LinkedHashSet。由于Set仅存储唯一元素,因此此过程会自动删除重复项。由于LinkedHashSet保持插入顺序,因此数组元素序列也不会受到干扰。参见示例。
  • 用Java编写自己的逻辑,以从数组中删除重复的元素。参见示例。
  • 使用Java Stream API的distinct()方法,我们可以从数组中删除重复的元素。 Java 8及更高版本提供此选项。参见示例。

使用LinkedHashSet从数组中删除重复项

public class RemoveDuplicates {
	public static void main(String[] args) {
		int[] numArr = {1, 1, 6, 7, 56, 9, 1, 23, 56, 7, 9, 10, 10};
		System.out.println("Original Array- " + Arrays.toString(numArr));
		int[] tempArr = findAndRemoveDuplicates(numArr);
		System.out.println("After removing duplicates- " + Arrays.toString(tempArr));
	}
	
	public static int[] findAndRemoveDuplicates(int[] numArr){
		// creating List from array
		List<Integer> numList = new ArrayList<Integer>();
		for(int i : numArr){
			numList.add(i);
		}
		Set<Integer> set = new LinkedHashSet<Integer>(numList);
		// Putting elements back in array
		int[] tempArray = new int[set.size()];
		int j =0;
		for(int num:set){
			tempArray[j++] = num;
		}
		return tempArray;
	}
}

输出:

Original Array- [1, 1, 6, 7, 56, 9, 1, 23, 56, 7, 9, 10, 10]
After removing duplicates- [1, 6, 7, 56, 9, 23, 10]

从输出中可以看到,由于使用了LinkedHashSet,所以数组中元素的顺序没有改变。

从数组Java程序中删除重复项-自己的逻辑

如果我们不应该为此使用任何Java Collection API或者任何其他Java API,则可以编写自己的逻辑来一次选择一个数组元素,然后在另一个内部循环中扫描整个数组以检查该元素重复。如果是,则需要将其删除。

从数组中删除元素将需要一些工作,因为数组一旦创建便具有固定大小。因此,删除元素意味着将所有在删除元素之后的元素向左移动以填充该间隙。但是,一旦将元素向左移动,就会出现另一个问题,即在数组末尾创建一个空格。为了解决该问题,我们需要跟踪删除了多少个元素并相应地减小数组大小。使用减小的大小创建一个新数组,并从原始数组中复制范围为0 –减小大小的元素。

要查看从数组中删除元素的各种选项,请参阅这篇文章。从Java中的数组中删除元素

下面的程序从数组中删除重复项,并保留数组的顺序。

public class RemoveDuplicates {
  public static void main(String[] args) {
    int[] numArr = {6, 6, 4, 15, 7, 6, 12, 7, 12, 12, 3, 8};
    System.out.println("Original Array- " + Arrays.toString(numArr));
    int[] tempArr = findAndRemoveDuplicates(numArr);
    System.out.println("After removing duplicates- " + Arrays.toString(tempArr));
  }
	
  public static int[] findAndRemoveDuplicates(int[] numArr){
    int size = numArr.length;
    for(int i = 0; i < size; i++){
      // for each element check for duplicates
      for(int j = i+1; j < size;){
        if(numArr[i] == numArr[j]){
          // shift elements to the left to remove duplicate
          for(int k = j; k < size-1; k++){
            numArr[k] = numArr[k+1];
          }
          size = size - 1;
        }else{
          j++;
        }
      }
    }
    // create temp array of reduced size
    int[] tempArray = new int[size];
    // copy array elements
    System.arraycopy(numArr, 0, tempArray, 0, size);
    return tempArray;
  }
}

输出:

Original Array- [6, 6, 4, 15, 7, 6, 12, 7, 12, 12, 3, 8]
After removing duplicates- [6, 4, 15, 7, 12, 3, 8]

如果我们有排序的数组,则可以使用以下程序从数组中删除重复项。该代码仅使用一个循环,从而降低了时间复杂度。
这里的逻辑是必须有两个变量来比较相邻的数组元素(以0和1开始),如果元素相等,则递增变量之一。仅当元素不相等时才交换元素,这样会将重复的元素推到右侧。
然后创建一个尺寸减小的临时数组,以仅保留唯一元素。

public class RemoveDuplicates {
	public static void main(String[] args) {
		//int[] numArr = {4, 6, 6, 4, 15, 7, 6, 12, 7, 12, 12, 3, 8};
		int[] numArr = {1, 1, 1, 6, 7, 7, 9, 9, 10, 10, 23, 56, 56};
		System.out.println("Original Array- " + Arrays.toString(numArr));
		int[] tempArr = findAndRemoveDuplicates(numArr);
		
		System.out.println("After removing duplicates- " + Arrays.toString(tempArr));
	}
	
	public static int[] findAndRemoveDuplicates(int[] numArr){
		int i = 1;
		int j = 0;
		while(i < numArr.length){
			if(numArr[i] == numArr[j]){
				i++;
			}else{
				numArr[++j] = numArr[i++];
			} 
		}
		//create temp array with reduced size
		int[] tempArray = Arrays.copyOf(numArr, j+1);
		return tempArray;
	}
}

使用Java Streams从排序数组中删除重复项

从Java 8开始,我们还可以使用Java Stream API的distinct()方法以非常紧凑的方式从数组中删除重复项。
unique()方法返回由不同元素组成的流,对于重复元素,将保留按遇到顺序显示在最前面的元素。

public class RemoveDuplicates {
  public static void main(String[] args) {
    int[] numArr = {4, 6, 6, 4, 15, 7, 6, 12, 7, 12, 12, 3, 8};
    System.out.println("Original Array- " + Arrays.toString(numArr));
    int tempArray[] = Arrays.stream(numArr).distinct().toArray();	
    System.out.println("After removing duplicates- " + Arrays.toString(tempArray));
  }
}

输出:

Original Array- [4, 6, 6, 4, 15, 7, 6, 12, 7, 12, 12, 3, 8]
After removing duplicates- [4, 6, 15, 7, 12, 3, 8]