两个List比较各自对象的属性相同的问题

最近做checkbox默认勾选的时候,涉及到两个list直接比较彼此对象的Id属性是否相同的问题。能力有限,想到这个笨方法。

创建一个Bean:

public class Bean {

  private String name;
  private String id;
  private String ch;

  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getCh() {
    return ch;
  }
  public void setCh(String ch) {
    this.ch = ch;
  }

}

造出两个list:

Bean b1 = new Bean();
b1.setId("1");
b1.setName("n1");
Bean b2 = new Bean();
b2.setId("2");
b2.setName("n2");
Bean b3 = new Bean();
b3.setId("3");
b3.setName("n3");
Bean b4 = new Bean();
b4.setId("4");
b4.setName("n4");

Bean b5 = new Bean();
b5.setId("2");
b5.setName("n2");
Bean b6 = new Bean();
b6.setId("1");
b6.setName("n1");

List<Bean> la = new ArrayList<Bean>();
la.add(b1);
la.add(b2);
la.add(b3);
la.add(b4);

List<Bean> lb = new ArrayList<Bean>();
lb.add(b5);
lb.add(b6);

写一个测试的main方法:

for(int i=0;i<la.size();i++){
    if(lb.contains(la.get(i).getId())){
        la.get(i).setCh("ch");
    }
    else{
        la.get(i).setCh(" ");
    }
     System.out.println("eeee"+la.get(i).getId()+"-----"+la.get(i).getCh());
}

输出结果是:

eeee1-----
eeee2-----
eeee3-----
eeee4-----

这结果完全不是自己想要的,查了一下,list.contains(o),系统会对list中的每个元素e调用o.equals(e),方法,假如list中有n个元素,那么会调用n次o.equals(e),只要有一次o.equals(e)返回了true,那么list.contains(o)返回true,否则返回false,控制台打印了一下直接返回的false,顿时明白了什么。

重新修改下

for(int i=0;i<la.size();i++){
    for(int k=0;k<lb.size();k++){
    if(lb.get(k).getId().equals(la.get(i).getId())){
        la.get(i).setCh("ch");
    }
    else{
        la.get(i).setCh(" ");
    }

    }
    System.out.println("eeee"+la.get(i).getId()+"-----"+la.get(i).getCh());

}

输出结果:
eeee1-----ch
eeee2-----
eeee3-----
eeee4-----

这结果还是不对啊,无奈想到了debug断点调试,发现问题了,再次修改一下了。

for(int i=0;i<la.size();i++){
    for(int k=0;k<lb.size();k++){
    if(lb.get(k).getId().equals(la.get(i).getId())){
        la.get(i).setCh("ch");
        break;
    }
    else{
        la.get(i).setCh(" ");
    }

    }
    System.out.println("eeee"+la.get(i).getId()+"-----"+la.get(i).getCh());
}

输出结果
eeee1-----ch
eeee2-----ch
eeee3-----
eeee4-----

时间: 2024-10-24 21:12:33

两个List比较各自对象的属性相同的问题的相关文章

【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更

java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; import java.lang.reflect.Field; import java.util.*; /** * @ClassName Test * @Description 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 * @Author sxd

有两个地方,用到了javabean对象和属性字符串值之间的转换

1.有两个地方,用到了javabean对象和属性字符串值之间的转换 2.一个是接入层spring mvc,将json字符串参数转换为javaBean.通过@RequestBody javaBean方式 3.另一个是,mybatis中javeBean对象与数据库字段值之间的转换. 在sql语句的insert/update/delete语句传入javaBean对象,用#{}转换为具体的属性 在sql语句的select中,将数据库中的字段转换为javaBean的属性值. 4.只要发生javaBean的

js对象中属性调用.和[] 两种方式的区别

JS 调用属性一般有两种方法——点和中括号的方法. 标准格式是对象.属性(不带双引号),注意一点的是:js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等等. 加引号是为了将其视为整体,认识一点:从对象角度,属性是不加引号的,如name,"name"这是啥,属性不可能是“name”,所以即使加了双引号,对象调用时还是要去掉引号的 例如 使用.方法 var obj = { name: "cedric" } console.

使用Java对两个对象的属性进行拷贝

最近和Java的反射打交道比较多一点,可能是因为自己以后的方向是架构师的缘故吧,他们主要搞业务.我能也就搞架构,整天画一些流程图. 虽然对于只有一年实习经验的我,不知道这样是否好,但是我还是那句话,不论好坏,先走着,毕竟也能学到很多东西,而且还可以锻炼自己的思维能力. 表达能力,因为自己的产品做的再好,你就是表达不出来,说不出来优势,那么你就败了. 先创建一个实体类User package com.mine.practice.copyproperty.entity; /** * * @autho

js对象 对属性调用.和[] 两种方式遇到过得区别

1   .标准格式是对象.属性(不带双引号)     注意一点的是js对象的属性,key标准是不用加引号的,加也可以,特别的情况必须加,如果key数字啊,表达式啊等等,加引号是为了将其视为整体,认识一点:从对象角度,属性是不加引号的,如name,"name"这是啥,属性不可能是“name”, 所以即使加了双引号,对象调用时还是要去掉引号的 2   []标准格式是对象["属性"]记住属性都是没有引号的,这种方式访问属性上必须有引号 论证一点不管key带不带引号,从对象

[原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

javascript中对象的属性的特性

enumberable: 表示是否能通过for-in循环返回属性.默认为true writable: 是否可以修改属性, 默认为true value: 包含这个属性的数据值.读取属性值时3,从这个属性读,写入属性时,把新值保存到这个位置.默认值为undefine. getter: 在读取属性时,调用的函数 setter: 在写入属性时调用的函数 特别注意:一旦调用了Object.defineProperty方法之后,那些未定义的特性值除了configurable为false之外,其他都为unde

解析DOM节点对象的属性

1.文档对象模型(DOM) 定义:允许程序和脚本访问.更改文档内容.样式和结构.它是平台无关的,意味着可以在任何计算机上使用它.它是语言无关的,以为着它能够交换客户机和服务器之间的信息,而不管任意一边使用什么语言. 2.DOM节点 DOM把HTML(或XML)文档视为一颗或者一组数(是指结构类似),也就是有一个顶层和多个构成子层的分支,并且每个子层又有分支和更多子层,顶层是文档(document),而文档的根元素是<html>. 3.节点对象属性 DOM节点对象的属性 属性 方法 childN

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.