java set的去重问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java set的去重问题相关的知识,希望对你有一定的参考价值。

set类本身虽然可以对加入的数据进行去重,但只对于基本数据类型以及String类有效。
如果添加的是 数组或类 ,那么set在添加时是根据其内存地址是否相同而非内容。
重写equals方法需要在被添加类中进行,但
如果此类为java本身自带的类,不适合直接更改该类的内容。
另外对于数组,在java内是找不到其所属类的,也就意味着不可能去重写equals。
因此需要如何解决该问题?

例:
HashSet<String[ ]> hSet=new HashSet();
String[ ] str1="A","B";
String[ ] str2="A","B";
String[ ] str3="A","C";
hSet.add(str1);
hSet.add(str2);
hSet.add(str3);

如何使得在添加str2时能被忽略?
(这个是个例,需要通用的解决方法,即对于任何length的String[ ],在将其加入set时均能判断其内容是否已存在)

谢谢,如果能解决问题有加分

/**
    您好,提问者:
  怎么可以用Set呢,Map是无重复的,使用Map方便,下面是例子,您看下。
**/
import java.util.HashMap;
import java.util.Map;

public class Demo 

public static void main(String[] args) 
String[] str1 =  "A", "B" ;
String[] str2 =  "A", "B" ;
String[] str3 =  "A", "C" ;
Map<String, String[]> map = new HashMap<String, String[]>();
map = setMap("str1",str1,map);
map = setMap("str2",str2,map);
map = setMap("str3",str3,map);

public static Map<String, String[]> setMap(String name, String[] arr,Map<String, String[]> map)
if(map.size() == 0)
map.put(name, arr);
else
for(int i = 0; i < arr.length; i++)
for(String[] str : map.values())
if(str[i] != arr[i])
map.put(name, arr);




return map;

追问

那我如果要遍历整个Map(在不知道key和value规律的情况下)并且进行一些操作,放入一个新Map时,怎么同时遍历并获得每个key和对应的value?

追答Iterator it=map.entrySet().iterator();           
System.out.println( map.entrySet().size());    
String key;           
String value;    
while(it.hasNext())    
        Map.Entry entry = (Map.Entry)it.next();           
        key=entry.getKey().toString();           
        value=entry.getValue().toString();           
        System.out.println(key+"===="+value);                     
参考技术A 对于java的自身类完全可以继承实现,然后覆写子类的方法。对于数组去重你可以写方法如判断长度,在判断内容,这都可以灵活实现。用Map觉得不符合其类定义的初衷了。

以上是关于java set的去重问题的主要内容,如果未能解决你的问题,请参考以下文章

python列表的去重

python:列表的去重:两种方法的问题是:结果是没有保持原来的顺序。

java对list集合进行去重 传统方式 VS Lambda

scrapy的去重机制

数组的去重方法

JavaScript 之 普通数组对象数组的去重(涉及多个场景)