对数组去除重复的元素也是常用的操作。数组一旦定义了大小之后,就不能再增加或者减小,所以去重后的元素应该存放到一个新的数组中保存。
去重最简单的思路就是:依次把旧数组中的元素存放到新数组中,但是在放入新数组中之前,要先在新数组中查找一次,看该元素是否已经存在了,如果没有存在,就把这个元素添加到新数组中去,存在的话就跳过。
前面我们已经说过了,数组的大小一经定义就不能再改变,所以我们可以先按最大长度去新建一个临时数组,再把其中的有效值复制到一个相应大小的数组中去。记得置空临时数组,便于垃圾回收。
在正式进行操作之前,让我们再来一起认识一个方法:System.arraycopy ——用于数组的复制。该数组的作用如下:
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
其中:
src:源数组。
srcPos:源数组中的起始位置。
dest:目标数组。
destPos:目标数据中的起始位置。
length:要复制的数组元素的数量。
该方法从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。
该方法的使用方式如示例 1 所示。
【示例 1】数组的去重
package chapter5;
public class noRepeat {
public static void main(String[] args) {
int[] scores = { 1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 0, 0, 5 }; // 新建数组
System.out.println(“展示去重前的数组元素:”);
for (int aux : scores) {
System.out.print(aux + “\t”);
}
System.out.println();
int[] newScores = new int[scores.length];
int index = 0; // 新数组的长度
boolean isRepetition = false; // 标识在数组中是否存在
newScores[index++] = scores[0];
for (int i = 0; i < scores.length; i++) { // 遍历原数组
for (int j = 0; j < index; j++) {
if (scores[i] == newScores[j]) { // 元素已经存在
isRepetition = true;
break;
}
}
if (isRepetition == false) {
newScores[index++] = scores[i]; // 存放没有出现过的元素
}
isRepetition = false;
}
scores = new int[index]; // 新建存放已经去重后的元素
System.arraycopy(newScores, 0, scores, 0, index); // 数组复制
System.out.println(“排重后的数组为:”);
for (int aux : scores) {
System.out.print(aux + “\t”);
}
System.out.println();
newScores = null; // 指针置空,便于垃圾回收
}
}
程序编译后,运行结果如下:
展示去重前的数组元素:
1 2 1 3 2 1 4 3 2 1 0 0 5
排重后的数组为:
1 2 3 4 0 5
示例 1 中展示了如何对数组中的重复数据进行排重。
在进行原数组的遍历过程中,通过使用标识位 isRepetition 来判断当前元素是否已经出现过,如果当前元素没有出现过,就将其记录下来存放到临时数组中;如果出现过,就直接跳出本次循环,转为判断数组中的下一个元素。
在原数组中所有的元素都判断完成之后,使用 arraycopy() 方法将临时数组复制到原数组中,从而实现数组的排重。