发布网友
共5个回答
热心网友
最简单的方式,我觉得效率也比较高的! 你建一个set。TreeSet吧,把组数组里面的数据取出来一个一个放入set。最后set里面的数据就是没有重复的了!把set再放回ArrayList就OK。好处是,不管List有多大,放入的时候都是一个一个放的。我尝试过给6万条数据去重复,效率还是可以的追问没说要放回ArrayList。。。我只是字符串数组去重而已
假设最糟糕情况下(嗯,比如100000个不重复)的比较次数似乎不少?
追答不需要比较,放进去,set里面的数据就是你要的值。就放进去,就完了。
热心网友
代码如下:
public static void main(String[] args) {
int[] Nums = { 100, 2, 2, 3, 4, 5, 5, 5, 7, 7, 8, 9, 9, 23, 45, 75, 75,
78, 80, 99, 99, 199 };
Integer [] aa = getDistinct(Nums);
for(int i : aa){
System.out.println(i);
}
}
static Integer[] getDistinct(int num[]) {
List<Integer> list = new java.util.ArrayList<Integer>();
for (int i = 0; i < num.length; i++) {
if (!list.contains(num[i])) {//如果list数组不包括num[i]中的值的话,就返回true。
list.add(num[i]); //在list数组中加入num[i]的值。已经过滤过。
}
}
return list.toArray(new Integer[0]);
//toArray(数组)方法返回数组。并要指定Integer类型。new
integer[o]的空间大小不用考虑。因为如果list中的长度大于0(你integer的长度),toArray方法会分配一个具有指定数组的运行
时类型和此列表大小的新数组。
}
热心网友
如果是数组的话,这个空间上是可以重复利用的(从C的角度考虑)。但是如果一定要用ArrayList,那么我想就只能重新开一个ArrayList了,保证扫一遍就去重完成。
热心网友
public class Array{
public static void main(String[] args) {
String[] arr = {"AA","AA","AB","BB","CC","CC","CD","DD","DD","EE","HH","NN","NN","XX"};
java.util.Set<String> set = new java.util.HashSet<String>();
for(int i = 0; i < arr.length; i++){
set.add(arr[i]);
}
String[] strarr = new String[set.size()];
int i = -1;
for(String str : set){
strarr[++i] = str;
}
java.util.Arrays.sort(strarr); //set集合是无序的,用冒泡排序
System.out.println(java.util.Arrays.toString(strarr)); //输出字符串格式数组的值
}
}
追问一定要破坏原本的有序性吗?
把有序性破坏掉重排一次效率损失还是不小的...
(另外String数组使用Arrays.sort应该是堆排序吧?)
追答Set是无须的,如果不破坏顺序,可以使用ArrayList。
热心网友
用HashSet 把数组无脑全往里存就行了 他会自动去重 如果要对对象去重
重写equals和hashcode方法 给定equals比较规则追问只是字符串去重
放到HashSet之后用toArray写入新数组,但是原本的有序性保留吗?
追答想要不破坏顺序就用LinkedHashSet 放假了 懒得开电脑才看见 回答晚了 希望能帮你解决