对数组去除重复的元素也是常用的操作。数组一旦定义了大小之后,就不能再增加或者减小,所以去重后的元素应该存放到一个新的数组中保存。

去重最简单的思路就是:依次把旧数组中的元素存放到新数组中,但是在放入新数组中之前,要先在新数组中查找一次,看该元素是否已经存在了,如果没有存在,就把这个元素添加到新数组中去,存在的话就跳过。

前面我们已经说过了,数组的大小一经定义就不能再改变,所以我们可以先按最大长度去新建一个临时数组,再把其中的有效值复制到一个相应大小的数组中去。记得置空临时数组,便于垃圾回收。

在正式进行操作之前,让我们再来一起认识一个方法: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() 方法将临时数组复制到原数组中,从而实现数组的排重。


版权声明:本文为weixin_33273559原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_33273559/article/details/114572082