精华内容
下载资源
问答
  • 判断两个List元素是否相同

    万次阅读 2019-05-15 18:06:14
    判断两个List元素是否相同,注释的很清楚,先看一下工具类: /** * 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同 * 哈希地址相同 返回true * 如果两个参数都为空,则返回true * ...

    判断两个List元素是否相同,注释的很清楚,先看一下工具类:

    评论区有小哥提出下面这种写法对于集合中有重复元素时,会判断不准确;这个坑记录一下;

    不要用下面这个方法!!!

        /**
         * 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同
         * 哈希地址相同 返回true
         * 如果两个参数都为空,则返回true
         * 如果有一项为空,则返回false
         * 如果数据长度不相同,则返回false
         * 集合1包含集合2中的所有元素,并且集合2也包含集合1中的所有元素 则返回true
         * 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同
         * @param l0
         * @param l1
         * @return
         */
        public static boolean isListEqual(List l0, List l1){
            if (l0 == l1)
                return true;
            if (l0 == null && l1 == null)
                return true;
            if (l0 == null || l1 == null)
                return false;
            if (l0.size() != l1.size())
                return false;
           if (l0.containsAll(l1) && l1.containsAll(l0)){
               return true;
           }
           return false;
        }

    分别比较两个List集合的哈希地址、NULL判断,长度判断、和内容判断;

    但有一点特别显眼:集合中的元素必须重写equals方法自行判断元素是否相同

    原因:containsAll方法的逻辑是逐个contains,而contains的包含逻辑是equals判断;如果集合中的元素没有重写equals方法,那么即使你的元素完全相同,比较的也是不准确;

     

    请使用这个工具类!!!

    public class ListUtils {
        /**
         * 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同
         * 哈希地址相同 返回true
         * 如果两个参数都为空,则返回true
         * 如果有一项为空,则返回false
         * 如果数据长度不相同,则返回false
         * 集合1包含集合2中的所有元素,并且集合2也包含集合1中的所有元素 则返回true
         * 注!!!!!!→ 集合中的元素必须重写equals方法自行判断元素是否相同
         * @param l0
         * @param l1
         * @return
         */
        public static boolean isListEqual(List l0, List l1){
            if (l0 == l1)
                return true;
            if (l0 == null && l1 == null)
                return true;
            if (l0 == null || l1 == null)
                return false;
            if (l0.size() != l1.size())
                return false;
            if (isEqualCollection(l0 , l1) && l0.containsAll(l1) && l1.containsAll(l0)){
                return true;
            }
            return false;
        }
    
    
    
        private static final Integer INTEGER_ONE = 1;
        public static boolean isEqualCollection(Collection a, Collection b){
            if (a.size() !=b.size()) {  // size是最简单的相等条件
                return false;
            }
            Map mapa = getCardinalityMap(a);
            Map mapb = getCardinalityMap(b);
    
            // 转换map后,能去掉重复的,这时候size就是非重复项,也是先决条件
            if (mapa.size() !=mapb.size()) {
                return false;
            }
            Iterator it =mapa.keySet().iterator();
            while (it.hasNext()) {
                Object obj = it.next();
                // 查询同一个obj,首先两边都要有,而且还要校验重复个数,就是map.value
                if (getFreq(obj,mapa) != getFreq(obj, mapb)) {
                    return false;
                }
            }
            return true;
        }
        /**
         * 以obj为key,可以防止重复,如果重复就value++
         * 这样实际上记录了元素以及出现的次数
         */
        public static Map getCardinalityMap(Collection coll) {
            Map count = new HashMap();
            for (Iterator it =coll.iterator(); it.hasNext();) {
                Object obj =it.next();
                Integer c =(Integer) count.get(obj);
                if (c == null)
                    count.put(obj, INTEGER_ONE);
                else {
                    count.put(obj, new Integer(c.intValue() + 1));
                }
            }
            return count;
        }
        private static final int getFreq(Object obj, Map freqMap) {
            Integer count =(Integer) freqMap.get(obj);
            if (count != null) {
                return count.intValue();
            }
            return 0;
        }
    
    }

     

    测试1,没有重写equals:

    public class BaseControllerCommandBean {
    
        private String comdName;
        private String comdValue;
    
        public BaseControllerCommandBean(){
    
        }
        public BaseControllerCommandBean(String name, String value){
            comdValue = value;
            comdName = name;
        }
    
        public String getComdName() {
            return comdName;
        }
    
        public void setComdName(String comdName) {
            this.comdName = comdName;
        }
    
        public String getComdValue() {
            return comdValue;
        }
    
        public void setComdValue(String comdValue) {
            this.comdValue = comdValue;
        }
    
        public static void main(String[] gin){
            ArrayList l0 = new ArrayList();
            l0.add(new BaseControllerCommandBean("1","ccc"));
            l0.add(new BaseControllerCommandBean("123","abc"));
    
            ArrayList l1 = new ArrayList();
            l1.add(new BaseControllerCommandBean("1","ccc"));
            l1.add(new BaseControllerCommandBean("123","abc"));
    
            System.out.println(ListUtils.isListEqual(l0,l1));
        }
    }

     

    测试2,重写equals以后:

    public class BaseControllerCommandBean {
    
        private String comdName;
        private String comdValue;
    
        public BaseControllerCommandBean(){
    
        }
        public BaseControllerCommandBean(String name, String value){
            comdValue = value;
            comdName = name;
        }
    
        public String getComdName() {
            return comdName;
        }
    
        public void setComdName(String comdName) {
            this.comdName = comdName;
        }
    
        public String getComdValue() {
            return comdValue;
        }
    
        public void setComdValue(String comdValue) {
            this.comdValue = comdValue;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == null && obj == null)
                return true;
            if (this == null || obj == null)
                return false;
            if (obj.getClass() != this.getClass())
                return false;
            BaseControllerCommandBean objBean = (BaseControllerCommandBean) obj;
    //        if (TextUtils.equals(this.comdName,objBean.comdName) && TextUtils.equals(this.comdValue,objBean.comdValue))
            if (this.comdName.equals(objBean.comdName) && this.comdValue.equals(objBean.comdValue))
                return true;
            return false;
        }
    
        public static void main(String[] gin){
            ArrayList l0 = new ArrayList();
            l0.add(new BaseControllerCommandBean("1","ccc"));
            l0.add(new BaseControllerCommandBean("123","abc"));
    
            ArrayList l1 = new ArrayList();
            l1.add(new BaseControllerCommandBean("1","ccc"));
            l1.add(new BaseControllerCommandBean("123","abc"));
    
            System.out.println(ListUtils.isListEqual(l0,l1));
        }
    }

    集合中的泛型使用这个,判断元素是否相同就正确了;

    展开全文
  • Java判断两个List是否相同

    千次阅读 2018-12-10 09:53:00
    1.利用Java中为List提供的方法retainAll() .../** * 判断两个List内的元素是否相同 * <p> * 此方法有bug 见Food.class * * @param list1 * @param list2 * @return */ private static boolean getDiff...

    1.利用Java中为List提供的方法retainAll()

    /**
    * 判断两个List内的元素是否相同
    * <p>
    * 此方法有bug 见Food.class
    *
    * @param list1
    * @param list2
    * @return
    */
    private static boolean getDiffrent2(List<String> list1, List<String> list2) {
    long st = System.nanoTime();
    System.out.println("getDiffrent2 total times " + (System.nanoTime() - st));
    return !list1.retainAll(list2);
    }

     

    2.最粗暴的方法 (遍历两个List)

    /**
    * 判断两个List内的元素是否相同
    *
    * @param list1
    * @param list2
    * @return
    */
    private static boolean getDiffrent(List<String> list1, List<String> list2) {
    long st = System.nanoTime();
    if (list1.size() != list2.size()) {
    System.out.println("getDiffrent total times " + (System.nanoTime() - st));
    return false;
    }
    for (String str : list1) {
    if (!list2.contains(str)) {
    System.out.println("getDiffrent total times " + (System.nanoTime() - st));
    return false;
    }
    }
    System.out.println("getDiffrent total times " + (System.nanoTime() - st));
    return true;
    }

    转载于:https://www.cnblogs.com/ZJOE80/p/10094904.html

    展开全文
  • 比较两个List元素是否相同 /** * * @param * @param a * @param b * @return [Parameters description] * * @return boolean [Return type description] * @exception throws [Excetion] ...

    比较两个List元素是否相同

    /** <Description functions in a word>
    	 * <Detail description>
    	 * @param <T>
    	 * @param a
    	 * @param b
    	 * @return [Parameters description]
    	 * 
    	 * @return boolean [Return type description]
    	 * @exception throws [Excetion] [Exception description]
    	 * @see [Related classes#Related methods#Related properties]
    	 */
    	public synchronized <T extends Comparable<T>> boolean compare(List<T> a, List<T> b) {
    		if(a.size() != b.size())
    			return false;
    		Collections.sort(a);
    		Collections.sort(b);
    		for(int i=0;i<a.size();i++){
    			if(!a.get(i).equals(b.get(i)))
    				return false;
    		}
    		return true;
    	}

    查找出两个list的不同元素

    public List<String> getDiffElementUseMap(List<String> list1,List<String> list2){  //获得两个list中的不同元素,map方法  
    	final Integer flagUnique = 1;//无重复字符串的键值 
        	log.info("====Start   getDiffElementUseMap ====================="+new Date());
            long runtime = System.nanoTime();//开始计时  
            //利用map中不能有重复元素的特点  
            Map<String, Integer> map = new HashMap<String,Integer>(list1.size()+ list2.size());  
            List<String> diffList = new ArrayList<String>();//用于保存两个list中不同的元素  
            for (String string : list1) {  
                map.put(string,flagUnique);//先将list1中元素复制到map中保存  
            }  
    		for (String string : list2) {
    			Integer key = map.get(string);// 获得键值
    			if (key != null) {// 如果map中已经存在该元素,说明list1中存在该元素,那么将其key加1
    				map.put(string, ++key);
    				continue;
    			} else {// 如果不存在,则放入map中
    				map.put(string, flagUnique);
    			}
    		}
    		for (Map.Entry<String, Integer> entry : map.entrySet()) {
    			if (entry.getValue() == flagUnique)// 在map中,键值为flagUnique的元素即为无重复的元素
    			{
    				diffList.add(entry.getKey());
    			}
    		}
    		log.info("getDiffElementUseMap run time:"
    				+ (System.nanoTime() - runtime));
            log.info("====End    getDiffElementUseMap ====================="+new Date());
            return diffList;  
        }


    展开全文
  • Java两个List去掉相同元素

    千次阅读 2018-12-03 15:55:28
    public static void twoListDupRe(List frontList,List ... //为了避免null集合做个判断 if(frontList == null){ frontList = new ArrayList(); } if(afterList == null){ afterList = new ArrayList()...
     public static void twoListDupRe(List frontList,List afterList){
      //为了避免null集合做个判断
      if(frontList == null){
       frontList = new ArrayList();
      }
      if(afterList == null){
       afterList = new ArrayList();
      }
      boolean flag;
      for(int i = 0;i < afterList.size(); i++){
       flag = false;
       for(int j = 0;j < frontList.size();j++){
        if(afterList.get(i) == frontList.get(j) || afterList.get(i).equals(frontList.get(j))){
        flag = true;
        frontList.remove(frontList.get(j));
        //集合的长度和引用的指向跟着减少
        j--;
        }
       }
       if(flag){
        afterList.remove(afterList.get(i));
        i--;
       }
      }
     }
    展开全文
  • #列表1 list1 = ['张三', '李四', '王五', '老二'] #列表2 list2 = ['张三', '李四', '老二', '王七'] ...b = [y for y in (list1 + list2) if y not in a] #两个列表中的不同元素 print('a的值为:',a...
  • java比较两个list集合元素是否相同

    千次阅读 2019-05-24 14:38:36
    import java.util.ArrayList; import java.util.Arrays;...import java.util.List; public class ArrayEqualTest { public static void main(String[] args){ List<String> a = new ArrayList<&...
  • 判断List中是否包含相同元素

    千次阅读 2019-05-23 16:59:17
    判断List中是否包含相同元素 import java.util.ArrayList; import java.util.HashSet; import java.util.List; /** * 通过简单的代码判断List中是否包含相同元素 * @author wei 2017年7月10日 下午8:34:47 */ ...
  • 比较两个List是否相等(相同元素

    万次阅读 2015-01-18 16:21:31
    数组是一个连续的内存空间,所以一般来说,两个数组相等,就是意味着他们有相同的长度,相同元素,以及相同的顺序。我们看看JDK的Arrays.equals()实现就一目了然了。 public static boolean equals(int[] a, int...
  • ``` private List getDiff(List list1,List list2){ List list = new ArrayList(); //怎么写啊 return list; } ``` 怎么取出这两个List里面不同的元素,并且返回到一个新的List中?
  • #include<iostream> #include<string.h> using namespace std; class KB { private: int *s;//储存整数数组 int len;//数组长度 public: KB(int *ss,int le) ...//给数组指针开...
  • rt 循环两个list取出相同元素。。。。。。。。。。。。
  •  * 比较两个数组是否有相同元素,把相同元素去掉  * @param list1  * @param list2  * @return  */  @SuppressWarnings("unchecked")  public static List compareList(List list1,List list2) {  //...
  • public class loanDemo { @Test public void ...List netCodeList = new ArrayList<>(); netCodeList.add(“1”); List queryNetCodeList = new ArrayList<>(); queryNetCodeList.add(“0”)...
  • List<FindByStudentForPayResult> result = studentForPayResultList.stream().filter( (studentForPayResult) ->payList.stream().map(BaseActivePay::getStudentId).collect(Collectors.toList())....
  • * 有两个集合A和B,判断两个集合是否包含相同元素, * 可以使用retainAll方法:A.retainAll(B)。 * 如果存在相同元素,A中仅保留相同元素。 * 如果不存在相同元素,A会变为空。 */ public class ListTest...
  • java比较两个List集合的相同元素

    千次阅读 2018-11-21 09:31:57
    package demo8; //实体类 public class Test { private int number; public int getNumber() { return number;... System.out.println("有相同元素: " +value1); } } } } }
  • 判断两个集合的元素是否相同 1)基本数据类型 public static void main(String[] args) { List&lt;Integer&gt; list1=new ArrayList&lt;Integer&gt;(); list1.add(1); list1.add(2); list1....
  • Python:统计两个数组相同元素个数

    万次阅读 多人点赞 2020-02-28 09:51:48
    项目上做数据整合时,会涉及多张表,往往需要先了解两个表里的主key数组有多少相同元素。以前都是用两个for循环遍历,这样效率很低,不符合Python的精髓。正确用法如下: 1.对于没有相同元素的数组 两个数组如下:...
  • } /** * 找出两个集合中相同元素 * * @param collmax * @param collmin * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static Collection getSame(Collection collmax, Collection ...
  • 找出两个List集合重复的元素

    万次阅读 热门讨论 2019-02-13 20:26:56
    前几天,有个同事问我说怎么找出两个List集合中重复的元素,我当时就说一个集合在外面循环,一个集合在内循环,如果两个元素相等了,就找出来了,我回来一想还是不对,要是数据非常多,这样循环下去,服务器会卡死的...
  • 两个数据量很大的list集合中(每个集合都是10万条数据,集合元素为Student对象),怎么查找 # 两个集合中Student对象name属性相同元素
  • java基础--集合--判断两个集合元素以及元素顺序是否相等 1 ListUtils.isEqualList ListUtils.isEqualList(Collection<?> list1, Collection<?> list2)import org.apache.commons.collections4....
  • list_a = [1,2,3,4] list_b = [3,4,5,6,7] set_c = set(list_a) & set(list_b) list_c = list(set_c)可以得到:list_c = [3,4]
  • 比如这样一个需求,现有一个Teacher对象集合和一个Student对象集合,需要查出两个集合中姓名相同的记录该怎么办呢,通常我们想到的肯定是用双层for循环来做,如果用java8新特性lambda表达式怎么做呢?废话不多说,...
  • 比较两个list集合是否相同

    万次阅读 2019-07-08 15:50:03
    比较两个list集合是否相同 1.主要比较两个list中的元素,以及list的长度 2. list集合是有序的,并且list集合里的元素可以重复,因为该集合体系有索引 3.所以,list集合里元素可能有相同的,并且顺序可能不一样 第一...
  • //把2个相同list集合元素拿出来:目前最佳方法  List li1=new ArrayList();  li1.add("a");  li1.add("b");  li1.add("c");  li1.add("d");  List li2=new ArrayList();  li2.add("c");  li2.add("d...
  • Java 查找两个集合中的相同元素和不同元素 假设有这个集合, List<Category> metaCategs , 只要categId 在下面数组中,就从metaCategs中移除 Integer[] removeCategIds =ne...
  • list和list,A和B有部分属性相同,如id、name; list有5个元素,list有...现需要将这两个list中含相同id和name的元素剔除掉,获取新的list和list,新list<A>.size()=3,新list<B>.size()=6,请哪位大侠给一个高效的算法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 186,210
精华内容 74,484
关键字:

判断两个list的元素相同