精华内容
下载资源
问答
  • java 利用set去重复数据

    万次阅读 2018-07-31 10:10:13
    1.去重复字符串 public static void main(String args[]){ List<String> list=new ArrayList<String>(); list.add("abc"); list.add("ddd"); list....

    1.去重复字符串

    	public static void main(String args[]){
    		
    		List<String> list=new ArrayList<String>();
    		list.add("abc");
    		list.add("ddd");
    		list.add("ddd");
    		
    		System.out.println(">>>>>>>>>>>>去重复之前:>>>>>>>>>>>>>>");
    		for( Iterator<String>   it = list.iterator();  it.hasNext(); )  
    		{               
    		    System.out.println("value="+it.next().toString());              
    		}
    		
    		System.out.println(">>>>>>>>>>>>去重复之后:>>>>>>>>>>>>>>");
    		Set<String> set=new HashSet<String>();
    		set.addAll(list);
    		
    		for( Iterator<String>   it = set.iterator();  it.hasNext(); )  
    		{               
    		    System.out.println("value="+it.next().toString());              
    		} 
    		
    	}
    >>>>>>>>>>>>去重复之前:>>>>>>>>>>>>>>
    value=abc
    value=ddd
    value=ddd
    >>>>>>>>>>>>去重复之后:>>>>>>>>>>>>>>
    value=abc
    value=ddd

     2.如果是对象  需要重写对象的equals  hashCode  函数

    package test;
    
    public class A {
    
    	public String id;
    	public String name;
    	
    	public A(String id,String name){
    		this.id=id;
    		this.name=name;
    	}
    	
    	public boolean equals(Object o){
    		
    		System.out.println("compare....");
    		
    		if(o.getClass()!=getClass())
    			return false;
    		else{
    			A a=(A)o;
    			if(id.equals(a.id))
    				return true;
    			else
    				return false;
    		}
    	}
    	
    	public int hashCode() {
            return id.hashCode();
        }
    	
    	public String toString(){
    		return "[id:"+id+",name:"+name+"]";
    	}
    }
    
    public static void main(String args[]){
    		
    		List<A> list=new ArrayList<A>();
    		list.add(new A("1","chq"));
    		list.add(new A("1","chq"));
    		list.add(new A("2","dddd"));
    		
    		Set<A>  set=new HashSet<A>(); 
    		set.addAll(list);
    		
    		System.out.println("size="+ set.size() );  
    		  
    		for( Iterator<A>   it = set.iterator();  it.hasNext(); )  
    		{               
    		    System.out.println("value="+it.next().toString());              
    		} 
    		
    	}
    compare....
    size=2
    value=[id:1,name:chq]
    value=[id:2,name:dddd]

     

    展开全文
  • java厚积薄发之set去除重复object

    千次阅读 2016-12-01 17:10:17
    public class SetDemo { public static void main(String[] args) { Set nameSet = new HashSet(); nameSet.add("张三"); nameSet.add("李四"); nameSet.add("王五"); nameS
    public class SetDemo {
    
        public static void main(String[] args) {
            Set<String> nameSet = new HashSet<String>();
            nameSet.add("张三");
            nameSet.add("李四");
            nameSet.add("王五");
            nameSet.add("张三");
    
            // 输出结果 张三  李四  王五
            for(String name : nameSet){
                System.out.print(name + "\t");
            }
    
            // List集合去除重复基础数据
            List<String> nameList = new ArrayList<String>();
            nameList.add("张三");
            nameList.add("李四");
            nameList.add("王五");
            nameList.add("赵六");
            nameSet.addAll(nameList);
    
            // 输出结果 张三  李四  王五  赵六
            for(String name : nameSet){
                System.out.print(name + "\t");
            }
    }

          set集合针对String 类型和8大基础数据类型  过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,当equals 比较相等时,则会去比较hashCode值 hashCode的值 如果一致的话,则不会存进set。

          HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static final Object PRESENT = new Object();。HashSet跟HashMap一样,都是一个存放链表的数组。

      HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值。

    class User{
    
        protected Integer id;
    
        protected String username;
    
        public User(Integer id, String username){
            this.id = id;
            this.username = username;
        }
    
    
        /**
         * 如果对象类型是User 的话 则返回true 去比较hashCode值 
         */
        @Override
        public boolean equals(Object obj) {
            if(obj == null) return false;
            if(this == obj) return true;
            if(obj instanceof User){
                User user =(User)obj;
    //          if(user.id = this.id) return true; // 只比较id  
                // 比较id和username 一致时才返回true 之后再去比较 hashCode  
                if(user.id == this.id && user.username.equals(this.username)) return true;
            }
            return false;
        }
    
    
    
        /**
         * 重写hashcode 方法,返回的hashCode 不一样才认定为不同的对象 
         */
        @Override
        public int hashCode() {
    //      return id.hashCode(); // 只比较id,id一样就不添加进集合  
            return id.hashCode() + username.hashCode();
        }
        
    }

    public class SetDemo2 {
    
            public static void main(String[] args) {
    
                // 去除编号和用户名一样的 对象,需要重写 equals 方法 和 hashCode方法
                User admin = new User(1, "admin");
                User user = new User(2, "user");
                User user1 = new User(2, "user");
                User admin1 = new User(3, "admin");
    
    
                Set<User> userSet = new HashSet<User>();
                userSet.add(admin);
                userSet.add(user);
                userSet.add(admin1);
                userSet.add(user1);
    
    
                // 输入结果 admin1  admin3  user2
                for(User u : userSet){
                    System.out.print(u.username + u.id + "\t");
                }
    
                System.out.println(user.equals(null));
            }
        }


    展开全文
  • 利用Java Set 去除重复object

    万次阅读 2013-05-31 11:16:59
    import java.util.ArrayList; import java.util.HashSet; import java.util.List;... * 类描述:set集合针对String 类型和8大基础数据类型 过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    /**
     * 编写者:CP
     * 编写日期:2011-9-7
     * <br />类描述:set集合针对String 类型和8大基础数据类型  过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,当equals 比较相等时,则会去比较hashCode值 hashCode的值 如果一致的话,则不会存进set
     */
    public class SetDemo {
    	
    	public static void main(String[] args) {
    		Set<String> nameSet = new HashSet<String>();
    		nameSet.add("张三");
    		nameSet.add("李四");
    		nameSet.add("王五");
    		nameSet.add("张三");
    		
    		// 输出结果 张三	李四	王五
    		for(String name : nameSet){
    			System.out.print(name + "\t");
    		}
    		// List集合去除重复基础数据
    		List<String> nameList = new ArrayList<String>();
    		nameList.add("张三");
    		nameList.add("李四");
    		nameList.add("王五");
    		nameList.add("赵六");
    		nameSet.addAll(nameList);
    		
    		// 输出结果 张三	李四	王五	赵六
    		for(String name : nameSet){
    			System.out.print(name + "\t");
    		}
    		
    		// 去除编号和用户名一样的 对象,需要重写 equals 方法 和 hashCode方法
    		User admin = new User(1, "admin");
    		User user = new User(2, "user");
    		User user1 = new User(2, "user");
    		User admin1 = new User(3, "admin");
    		
    		
    		Set<User> userSet = new HashSet<User>();
    		userSet.add(admin);
    		userSet.add(user);
    		userSet.add(admin1);
    		userSet.add(user1);
    		// 输入结果 admin1	admin3	user2
    		for(User u : userSet){
    			System.out.print(u.username + u.id + "\t");
    		}
    		
    		System.out.println(user.equals(null));
    	}
    }
    
    class User{
    	
    	protected Integer id;
    	
    	protected String username;
    	
    	public User(Integer id, String username){
    		this.id = id;
    		this.username = username;
    	}
    
    
    	/**
    	 * 如果对象类型是User 的话 则返回true 去比较hashCode值
    	 */
    	@Override
    	public boolean equals(Object obj) {
    		if(obj == null) return false;
    		if(this == obj) return true;
    		if(obj instanceof User){ 
    			User user =(User)obj;
    //			if(user.id = this.id) return true; // 只比较id
    			// 比较id和username 一致时才返回true 之后再去比较 hashCode
    			if(user.id == this.id && user.username.equals(this.username)) return true;
    			}
    		return false;
    	}
    
    
    
    	/**
    	 * 重写hashcode 方法,返回的hashCode 不一样才认定为不同的对象
    	 */
    	@Override
    	public int hashCode() {
    //		return id.hashCode(); // 只比较id,id一样就不添加进集合
    		return id.hashCode() * username.hashCode();
    	}
    
    	
    }

    展开全文
  • 文章来源:...Set里的元素是不能重复的,那么用iterator()方法来区分重复与否 public static boolean isSetEqual(Set set1, Set set2) { if (set1 == null && set2 == null) { retu

    文章来源:http://blog.csdn.net/lxqluo/article/details/31394393

    Set里的元素是不能重复的,那么用iterator()方法来区分重复与否
    
    public static boolean isSetEqual(Set set1, Set set2) {
      
      if (set1 == null && set2 == null) {
       return true; // Both are null
      }
    
      if (set1 == null || set2 == null || set1.size() != set2.size()
        || set1.size() == 0 || set2.size() == 0) {
       return false;
      }
      
      Iterator ite1 = set1.iterator();
      Iterator ite2 = set2.iterator();
      
      boolean isFullEqual = true;
      
     <span style="color:#ff9966;"> while (ite2.hasNext()) {
       if (!set1.contains(ite2.next())) {
        isFullEqual = false;
       }
      }</span>
      
      return isFullEqual;
     }

    java treeset和hashset如何判断元素是否相同

    问:
    在使用treeset和hashset重复添加元素时,发现二者在比较自定义对象元素上不一样,如下例
    假设record对象包含两个信息,一个为int age,一个为String name
    
    Set<record> t0= new TreeSet<record>();
    		t0.add(new record(1,"lAn"));
    		t0.add(new record(1,"lAn"));
    		t0.add(new record(1,"lAn"));
    System.out.println(t0);
    treeset的输出为[1 lAn]
    
    将相同元素添加到hashset中
    Set<record> t1= new HashSet<record>();
    t1.add(new record(1,"lAn"));
    t1.add(new record(1,"lAn"));
    t1.add(new record(1,"lAn"));
    System.out.println(t0);
    输出为[1 lAn,1 lAn,1 lAn]
    
    为什么会有这种情况呢? hashset和treeset是怎么比较元素相等的?
    答:

    我想看下你得record类,问题可能出在你得record类里面,你是不是重写了hashcode方法?


    刚才看了一下,问题出在你得record类应该,你没有生成一个hashcode()方法,所以你得hashcode方法继承自object类

    object类的hashcode算法hashcode算出来的结果就是该对象在内存中的地址的十进制表示,你每次都是new出来的record,所以他们的内存地址一定是不一样,那么这就说明他们的hashcode不一样,而hashset对于相同对象的比较是使用hashcode的,他们的hashcode不同,那么自然被hashset认为是不一样的对象了,所以有了你的结果,建议record类里面写一个hashcode方法,可以利用Eclipse或MyEclipse的生成的那个hashcode算法


    然后说说treeset

    boss来了,等下给你补上


    好了,boss走了,吓死我了

    对于你的treeset,他是用compareTo方法判断是否相同,treeset要求你必须给record类实现comparable接口,你应该写了,但是这个接口有个方法compareTo你实现的时候可能是用了默认的吧,默认的compareTo方法只有一句,就是return 0;所以对于任何两个对象来说他们compareTo都是相同的,那么treeset就会认为这些record都是一样的,没区别,所以就只有一条

    ,建议可以利用下Eclipse或MyEclipse的equals算法生成,然后在compareTo方法里调用equals方法比较


    综上所述

    hashset用hashcode方法来实现比较是否相同

    而treeset用comparable接口的compareTo方法比较


    有问题可以追问,

    打了这么多字给分吧~~

    希望能帮助你


    我人还是太好了,附带着还是把record的代码发给你吧,免得你迷糊


    public class record implements Comparable{
        private int age;
        private String name;
         
        public record(int age,String name){
            // TODO Auto-generated constructor stub
            this.age=age;
            this.name=name;
        }
     
        @Override
        public int compareTo(Object o) {
            // TODO Auto-generated method stub
             
            if(equals(o)){
                return 0;
            }else {
                return -1;
            }
        }
     
        @Override
        public String toString() {
            return "record [age=" + age + ", name=" + name + "]";
        }
     
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
     
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            record other = (record) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
         
    }



    展开全文
  • 【用set集合去重复数据,重写equals还是不成功的问题解决思路在文章最后】 需求描述: 因业务需要,通过复杂的代码逻辑从数据库取出数据放入List集合中,涉及多次从访问数据库取出数据放入List集合中,其中会取到...
  • Set集合去重复

    千次阅读 2018-12-17 17:59:58
    Set集合和LIst集合的方法几乎完全一样,不同是Set 无序 不可重复。 1.去除List中重复数据,并存储再List中  List&lt;String&gt; user = new ArrayList&lt;String&gt;();  user.add("111&...
  • set集合去重复

    千次阅读 2016-03-16 13:29:25
    由于set集合是一个不包含重复元素的 collection,所以本身set集合存值是无序不重复的。如果将可变对象用作 set 元素,那么必须极其小心。如果对象是 set 中某个元素,以一种影响 equals 比较的方式改变对象的值,...
  • Set解决重复数据问题

    千次阅读 2019-10-14 09:32:49
    HashSet实现set接口,实际上是由...set不允许重复的元素,如果set已经有重复的元素,会返回false。 案例,给定一个字符串,返回第一个重复的字符。 public static String findFirstRepeatedChar(String string) ...
  • Set重复实现原理

    千次阅读 2018-08-31 15:35:59
    Java中的set是一个不包含重复元素的集合,确切地说,是不包含e1.equals(e2)的元素对。Set中允许添加null。Set不能保证集合里元素的顺序。 在往set中添加元素时,如果指定元素不存在,则添加成功。也就是说,如果set...
  • java中set集合如何去除重复元素

    千次阅读 2017-07-25 19:12:11
    set集合是可以重复的元素集合; 用set集合添加一个学生对象元素时:import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set;public class ...
  • 使用ES6的Set去除数组的重复元素

    万次阅读 2017-06-02 11:13:39
    使用ES6的Set去除数组的重复元素方法一Array.from()方法可以将Set结构转化为数组结构function dedupe(array) { return Array.from(new Set(array)); }dedupe([1,2,3,3]);方法二扩展运算符(…)内部使用for…of循环...
  • java 集合 Set 插入重复元素

    千次阅读 2019-05-04 13:21:35
    java 集合 Set 插入重复元素
  • 利用set对list进行合并去重复

    千次阅读 2017-05-06 12:56:38
    利用set对list进行合并去重复set是不重复的集合,可以使用set对有重复的两个list集合进行合并 List<String> list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("a"); //利用set ...
  • c++中容器set的去除重复元素排序

    千次阅读 2018-08-22 15:28:05
    两者不同在于前者不允许元素重复,而后者允许。 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素 2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行...
  • Python 使用set()去除列表重复

    万次阅读 2018-05-14 10:08:30
    1.对List重复项,可以使用set()去除重复 a = [5, 2, 5, 1, 4, 3, 4,1,0,2,3,8,9,9,9] print(list(set(a))) #将去掉重复的项后,再重新转成list 最后的执行结果 F:\Python\venv\Scripts\python.exe F:/Python/...
  • 去除Set集合中的重复元素

    千次阅读 2019-01-26 15:44:23
    去除 Set 集合的重复元素的方法与 equals(),hashCode()方法有关 class Person{ String name; int age; public String toString(){ return name+"..."+age; } } public class test1{ publi...
  • Set集合重复元素的判断

    千次阅读 2018-06-14 08:44:06
    更重要的是Set集合不能放置重复的元素.她是怎么判断的呢?那么,我们首先要让对象具有比较性 一,存储的自定义对象实现接口 Comparable 复写public int compareTo()方法. 返回0表示二者相等. 如...
  • js 数组去重复 数据 Set方法使用

    千次阅读 2018-11-15 17:22:27
    let ary = [1,1,2,3,1561,132,56,5,5,123,132,6,8,5,9,6,7,7,7,8] // Set方法 去重后 数组只有vlaue 没有key值 // 使用 ... 方法重新构建数组 console.log([...new Set(ary)])  
  • Python中利用set去除列表(list)重复元素要处理一些数据,需要去除掉重复元素,比如列表a = [5, 2, 5, 1, 4, 3, 4],可以用如下方式实现 **a = [5, 2, 5, 1, 4, 3, 4] print list(set(a))**
  • 在项目中看到一段代码:return new ArrayList(new HashSet(list));当时我的表情是这样的: ...想起一句话“存在即是合理”开始琢磨业务需要:list中的元素不能有重复。  那为什么不直接用HashSet
  • C++ std::set 出现重复元素

    千次阅读 2021-03-13 23:46:58
    如题,今天自定义了一个set的排序函数,重新构造了set,往里插入元素的时候居然出现了重复元素! 首先set的比较函数含义是按照元素的出现频率比较,高频率的大于低频率,如果二者频率相等,则数值小的大于数值大的...
  • python set函数,去除列表重复元素

    千次阅读 2018-01-15 10:07:38
    正如标题所说,set函数可以非常方便的将一个列表去重,例如 a = [1,2,3,4,4,2,3,31,3,3,2,4,313,1,21,21,3,3,22,2,2,2,3,3,3,4,4] b = set(a) print(a) print(b) 输出为 [1, 2, 3, 4, 4, 2, 3, 31, 3, 3,...
  • * 类描述:set集合针对String 类型和8大基础数据类型 过滤掉重复数据,如果存放的是其他类型对象,则需要重写hashCode方法和equals方法,当equals 比较相等时,则会比较hashCode值 hashCode的值 如果一致的话,则...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 944,672
精华内容 377,868
关键字:

set去重复