将source类中的属性值赋给target类中对应的属性

/**
     * 对象的属性值拷贝
     * <p>
     * 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样
     * <p>
     * example:
     * <p>
     * source:
     * <p>
     * String name;
     * String address;
     * Integer age;
     * Date   birthday;
     * <p>
     * target:
     * String name;
     * String address;
     * String email
     * <p>
     * 结果: source name, address -> target name, address
     *
     * @param source
     * @param target
     */

 

思路:三步走,

第一步:获取source和target的全部属性,放入List集合中(为什么要放入List集合中,为了偷懒而已,大可以不放就是多写一层循环而已);

第二步:比较两个类中属性名是否相等,相等的话,执行第三步,不相等,继续遍历,直到遍历结束;

第三步:判断属性的类型是否相同,相同赋值,不相同继续遍历,直到遍历结束

代码如下:

public static void copy(Object s, Object t) {
        //TODO
        List<String> list_s = new ArrayList<>();
        List<String> list_t = new ArrayList<>();
        //获取s的Class对象
        Class clss = s.getClass();
        //获取t的Class对象
        Class clst = t.getClass();
        //获取s中所有属性,并加入到集合list_s中
        Field[] fields = clss.getDeclaredFields();
        for(Field ff : fields){
            list_s.add(ff.getName());
        }
        //获取t中所有属性,并加入到集合list_t中
        Field[] fieldt = clst.getDeclaredFields();
        for(Field ff : fieldt){
            list_t.add(ff.getName());
        }
        //遍历list_t集合,在list_s集合中查找是否含有t的属性,包含判断属性类型是否相同,相同赋值
        for(String ss : list_t){
            if(list_s.contains(ss)&&isEqualFieldType(s,t,ss)){
                sCopyt(s,t,ss);
            }
        }

    }
//判断二者属性类型是否相同
    public static boolean isEqualFieldType(Object o1,Object o2,String s){
        Class cls1 = o1.getClass();
        Class cls2 = o2.getClass();
        try {
            Field f1 = cls1.getDeclaredField(s);
            Field f2 = cls2.getDeclaredField(s);
            if(f1.getType().getName().equals(f2.getType().getName())){
                return true;
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        return false;

    }
//将s中的属性值赋给t的属性值
    public static void sCopyt(Object o1,Object o2,String s){
        Class cls1 = o1.getClass();
        Class cls2 = o2.getClass();
        try {
      //获取对应的属性对象 Field f1
= cls1.getDeclaredField(s); Field f2 = cls2.getDeclaredField(s);
      //设置可见性 f1.setAccessible(
true); f2.setAccessible(true);
      //利用get和set方法进行赋值 f2.
set(o2,f1.get(o1)); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } }

 

转载于:https://www.cnblogs.com/du001011/p/10778133.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Python 中,可以使用 `pandas` 和 `plotly` 库来绘制弦图。首先,我们需要读取包含 `source`、`target` 和 `values` 数据的 Excel 文件,并将数据转换为适合绘制弦图的形式。具体来说,我们需要将 `source` 和 `target` 转换为唯一的节点列表,然后使用这些节点的名称构建一个邻接矩阵,矩阵中的值为 `values`。 以下是一个示例代码,可以读取 Excel 文件并绘制弦图: ```python import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # 读取 Excel 文件数据 df = pd.read_excel('data.xlsx') # 获取唯一的节点列表 nodes = sorted(list(set(df['source'].tolist() + df['target'].tolist()))) # 构建邻接矩阵 adj_matrix = [[0] * len(nodes) for _ in range(len(nodes))] for _, row in df.iterrows(): i = nodes.index(row['source']) j = nodes.index(row['target']) adj_matrix[i][j] = row['values'] adj_matrix[j][i] = row['values'] # 绘制弦图 fig = make_subplots(rows=1, cols=1) fig.add_trace(go.Sankey( node=dict( pad=15, thickness=20, line=dict(color="black", width=0.5), label=nodes ), link=dict( source=[i for i in range(len(nodes)) for j in range(len(nodes)) if i != j and adj_matrix[i][j] > 0], target=[j for i in range(len(nodes)) for j in range(len(nodes)) if i != j and adj_matrix[i][j] > 0], value=[adj_matrix[i][j] for i in range(len(nodes)) for j in range(len(nodes)) if i != j and adj_matrix[i][j] > 0] ) )) fig.update_layout(title_text="Chord Diagram") fig.show() ``` 在上述代码中,我们首先使用 `pandas` 库的 `read_excel` 函数读取包含数据的 Excel 文件。接着,我们使用 `set` 函数和 `tolist` 方法获取唯一的节点列表。然后,我们构建一个空的邻接矩阵,并遍历数据框中的每一行,将 `source` 和 `target` 对应的值转换为矩阵中的行和列索引,然后将 `values` 存储在相应的矩阵元素中。最后,我们使用 `make_subplots` 函数创建一个子图,使用 `go.Sankey` 函数绘制弦图,其中 `node` 参数指定节点的属性,`link` 参数指定边的属性。我们使用列表推导式来构建 `source`、`target` 和 `value` 列表,其中 `i` 和 `j` 分别表示矩阵的行和列索引,如果 `adj_matrix[i][j]` 大于 0,则说明节点 i 和节点 j 之间存在一条边,并将其添加到对应的列表中。最后,我们使用 `update_layout` 函数添加标题,并使用 `show` 函数显示弦图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值