JAVA中如何从ArrayList中删除重复对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中如何从ArrayList中删除重复对象相关的知识,希望对你有一定的参考价值。

JAVA中如何从ArrayList中删除重复对象, 注意是对象, 网上给出的例子都是删除重复的基本类型, 重复对象是删不了的, 验证通过立即给分.
http://zhidao.baidu.com/question/464567103.html
http://zhidao.baidu.com/question/464535116.html
http://zhidao.baidu.com/question/464535116.html
这三个问题打包发布, 其实是同一个问题, 解决一个就能解决全部

参考技术A 你List中方的是什么?同一种类型对象,判断是否相同需要重写该类的equals()和hashCode()方法,这样就可以放到set中去重。如果是多少种不同类型对象或多种基本类型,那么如何判断是否重复?
arrayList.add(new String("123"));
arrayList.add(new String("123"));
arrayList.add(new int[] 1, 2, 3 );
arrayList.add(new int[] 1, 2, 3 );
如果仅仅只是基本类型和字符串对象可以再转换成字符串判断是否重复。
如果是自定义多种不同类型对象,没法进行比较是否重复。或者你把list里面具体放入的是什么类型对象贴出来根据实际情况给你去重。追问

我现在是想实现一个通用的去除 ArrayList 中重复对象的方法, Object类型不定, 所以难点就在这里, 有可能是Integer, 有可能是int[], 也有可能是自己定义的一个类, 但只要是重复就去除.
网上能找到的方法我都试过, 都只是针对基本类型有效, 对对象无效.

参考技术B 你给对象写一个toString方法,用这个标识,然后字符串一样的就不添加,能够过滤掉了追问

你把下面arrayList里的重复元素, 包括基本类型和对象, 删除就可以了
ArrayList arrayList = new ArrayList();
arrayList.add(123);
arrayList.add(123);
arrayList.add(new String("123"));
arrayList.add(new String("123"));
arrayList.add(new int[] 1, 2, 3 );
arrayList.add(new int[] 1, 2, 3 );

追答

你不是矛盾么,你说的是对象,你有没有说,任何类型的,那你toString的时候加个类型信息呗。你不设置list的类型,还想去重,那只能先判断类型,再判断内容了。

追问

对象不定, 两个 int[] 1,2,3, 只能保留一个, 难度就在这里
一向都是我挣别人的分, 要挣我的分, 不是那么容易
我把悬赏分数再提高

追答

好吧,我再看看,主要你的态度让我有点不爽,呵呵。再问一句,你的数组还有其他类型没有了,只是int[]型么,还是有别的

追问

就是ArrayList, Object不定, 有可能是 Integer, 也有可能是 int[], 也有可能是自己定义的一个类

追答

我问一句,即使我能过滤掉list中的重复数据,那你取对象的时候,你咋能知道你去的是啥啊。过滤完你是用不了有意义么。

参考技术C 不知道我下边写的你能不能看懂,如果不懂可以追问我
List list = new ArrayList();
Object s = new Object();
for(int i = 0;i<5;i++)
list.add(s);

for(int i = 0;i<list.size();i++)
for(int j = i+1;j<list.size();j++)
if(list.get(i).equals(list.get(j)))
list.remove(i);
i--;
break;



for(int i = 0;i<list.size();i++)
System.out.println(list.get(i));
追问

list.add(new int[] 1, 3, 4 );
list.add(new int[] 1, 3, 4 );
list.add(new String("123"));
list.add(new String("123"));
用这个取代循环赋值时, 有问题

追答

正常来说应该没有问题,你是不在定义list的时候加泛型了,
比如:List list ;

追问

没有, 就是上面那4个赋值, 只留下两个就行了, 网上流行的删除重复都只是针对重复基本类型有用, 对重复对象没有用.

追答

那我明白了,你的这个就是基本类型和对象类型的混合用法,建议你把基本类型转为对象类型,比如int型的转为Integer

追问

还是不行, 转为Integer后, 先前重复能删除的反而不能删除了, 这个问题看上去简单, 其实不简单, 我折腾了好一会了, 所以一定要有完整的代码, 最后测试通过才行.
问题还是没解决

追答

你把你的代码贴上来我看看

追问

其实也没什么代码, 就是下面这样, 留下3条记录就行了
ArrayList arrayList = new ArrayList();
arrayList.add(new String("123"));
arrayList.add(new String("123"));
arrayList.add(new int[] 1, 2, 3 );
arrayList.add(new int[] 1, 2, 3 );
arrayList.add(new Integer[] 1, 2, 3 );
arrayList.add(new Integer[] 1, 2, 3 );

追答

我现在明白你的意思了,你往里面放的对象都是new出来的,所以他们的地址都不一样,无法比较,对象一般都重写了equals方法来比较,但是int数组就没办法比较了,这个只能计算重写equals方法的。没有重写equals方法的判断不了。

追问

对, 你说中了这个问题的难点, 我开始想用类反射机制实现, 但不成功.

追答

那也很麻烦的,其实如果单单想比较数组也可以去做。
另一个问题就是你想没想明白其他对象来判断重复的条件呀,比如Object类的两个对象,怎么样算是相等,怎么样算是不相等呢。

追问

相等的判断就是 new的时候, 参数相同, 如
new int[]1,2,3, new int[]1,2,3
new Float(123) ,new Float(123)
这样的就认为两个对象是相等的

追答

对呀,这样的对象还可以判断,加入仅仅是一个普通的类,里面写了一些方法,没有参数呢?

追问

没有参数的类, 判断是相等, 如
HashMap map1 = new HashMap();
HashMap map2 = new HashMap();
map1, map2在加入arrayList后, 应该只保留1个
我在 http://zhidao.baidu.com/question/464567103.html 开了新帖, 要是想到办法, 可以到这里来回帖.

追答

这可真没有办法,我也关注关注看看谁有办法

参考技术D 遍历之,迁移到set中。(要求,必须有正确的hashcode和equals方法)追问

你这是从网上抄的, 自己肯定没有测试过, 也没有仔细看我的问题, 所以不能给分.

追答

我现在就给你写一个例子 10分钟

追问

好的, waitting for you

追答

代码:

public static void main(String[] args)

List<String> list = new ArrayList<String>();

list.add("hello");

list.add("china.");

list.add("hello");

list.add("world.");

System.out.println("现在打印list.");

print(list);

Set<String>  set = new HashSet<String>();

Iterator<String> it = list.iterator();

while(it.hasNext())

set.add(it.next());

System.out.println("现在打印set.");

print(set);



private static void print(Collection<String> c) 

Iterator<String> it = c.iterator();

while(it.hasNext())

System.out.println(it.next());


结果如图:

追问

你把下面arrayList里的重复元素, 包括基本类型和对象, 删除就可以了, 这分不好挣的 :)
ArrayList arrayList = new ArrayList();
arrayList.add(123);
arrayList.add(123);
arrayList.add(new String("123"));
arrayList.add(new String("123"));
arrayList.add(new int[] 1, 2, 3 );
arrayList.add(new int[] 1, 2, 3 );

追答

public static void main(String[] args)

ArrayList<Object> arrayList = new ArrayList<Object>(); 

arrayList.add(123); 

arrayList.add(123); 

arrayList.add(new String("123")); 

arrayList.add(new String("123")); 

arrayList.add(new int[]  1, 2, 3 );

System.out.println("现在打印list.");

print(arrayList);

Set<Object>  set = new HashSet<Object>();

Iterator<Object> it = arrayList.iterator();

while(it.hasNext())

set.add(it.next());

System.out.println("现在打印set.");

print(set);

private static void print(Collection<Object> c) 

Iterator<Object> it = c.iterator();

while(it.hasNext())

Object obj = it.next();

System.out.println("类型:"+obj.getClass().getName()+"   值:"+obj.toString());



追问

arrayList.add(new String("123"));
arrayList.add(new String("123"));
arrayList.add(new int[] 1, 2, 3 );
arrayList.add(new int[] 1, 2, 3 );
加个四个值时, 最后应该只留下2个, 上面的代码没有实现.

追答

不求甚解。 人云亦云。

第5个回答  2012-08-15 List<T>,ArrayList<T>都是泛型,给你例子意义不大,关键是要自己会举一反三;
如果你想往List里放对象,保证你心中的那个唯一,请重写hashcode()和equals()方法;
有个简单的方法是可以用Set,像@FourQueue 提到的那样。追问

兄弟, 没有写代码, 没有测试吧

以上是关于JAVA中如何从ArrayList中删除重复对象的主要内容,如果未能解决你的问题,请参考以下文章

删除 Java ArrayList 中的重复对象会导致并发修改错误 [重复]

Java删除ArrayList中的重复对象[重复]

如何从Android中的arraylist中删除重复值[重复]

从 ArrayList 中删除重复值

从 ArrayList 中捕获重复项

如何从 ArrayList 中删除重复的元素?