根据list中对象的属性去重和排序小结

//去重
public class User {
        private int id;
        private String name;
        private int age;
        public User(){}
        public User(int id, String name, int age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
        }

    }

public class ListTest {
/**
 *     有一个List<User>  list 放了五个对象:user1、user2、user3、user4、user5
    User有三个属性Id、name、age
    其中user2的记录大概是这样:“100”,"abc",20;
    user3的记录大概是这样:“100”,“def”,20;
    请问怎么才能只保留user2和user3中的一个对象,并将其中的name合并到新对象中,
    新对象如“100”,“abcdef”,20
    这只是举个例子,实际中有可能user4和user5与此类似,如果有id相同的两个对象,则对其进行
    合并,只保留一个对象,求一个通用的方法,能筛选出对象集合中某些相同ID的两个对象,将其合并
    仍保留在原list中
 * @param args
 */
    //list有序可重复、set无序不可重复、mapkey不允许重复,key相同的后面的value会把前面的覆盖掉
    //List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A、B、C,则取得时候,则也是A、B、C的顺序
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User(1,"a",20));
        list.add(new User(1,"a",20));
        list.add(new User(2,"a",20));
        list.add(new User(3,"b",20));
        list.add(new User(1,"c",20));
        list.add(new User(4,"d",20));
        list.add(new User(2,"e",20));
        list.add(new User(1,"a",20));
       /* for (User user : list) {
            System.out.println(user.toString());
        }
        System.out.println();*/
        list = mySort(list);
        for (User user : list) {
            System.out.println(user.toString());
        }

        }
        public static List<User> mySort(List<User> list){
            HashMap<Integer,User> tempMap = new HashMap<>();
            for (User user : list) {
                int key = user.getId();
// containsKey(Object key) 该方法判断Map集合对象中是否包含指定的键名。如果Map集合中包含指定的键名,则返回true,否则返回false
// containsValue(Object value)    value:要查询的Map集合的指定键值对象.如果Map集合中包含指定的键值,则返回true,否则返回false
                if(tempMap.containsKey(key)){
                    User tempUser = new User(key,
                                             tempMap.get(key).getName() + user.getName(),
                                             tempMap.get(key).getAge());//user.getAge();
//HashMap是不允许key重复的,所以如果有key重复的话,那么前面的value会被后面的value覆盖
                    tempMap.put(key, tempUser);
                }else{
                    tempMap.put(key, user);
                }
            }
            List<User> tempList = new ArrayList<>();
            for(int key : tempMap.keySet()){
                tempList.add(tempMap.get(key));
            }
            return tempList;
        }

    }

//排序=============================================
public class Student {
    private int age;
    private String name;
    public int getAge() {
        return age;
    }  

    public void setAge(int age) {
        this.age = age;
    }  

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student [age=" + age + ", name=" + name + "]";
    }  

}
public class ListSort {

    public static void main(String[] args) {
         List<Student> list = new ArrayList<Student>();  

            //创建3个学生对象,年龄分别是20、19、21,并将他们依次放入List中
            Student s1 = new Student();
            s1.setAge(20);
            s1.setName("葛大");
            Student s2 = new Student();
            s2.setAge(19);
            s2.setName("张杰");
            Student s3 = new Student();
            s3.setAge(21);
            s3.setName("宝爷");
            list.add(s1);
            list.add(s2);
            list.add(s3);  

            System.out.println("排序前:"+list);  

            Collections.sort(list, new Comparator<Student>(){  

                /*
                 * int compare(Student o1, Student o2) 返回一个基本类型的整型,
                 * 返回负数表示:o1 小于o2,
                 * 返回0 表示:o1和o2相等,
                 * 返回正数表示:o1大于o2。
                 */
                public int compare(Student o1, Student o2) {  

                    //按照学生的年龄进行升序排列  ;<是降序
//                    /*if(o1.getAge() > o2.getAge()){
//                        return 1;
//                    }
//                    if(o1.getAge() == o2.getAge()){
//                        return 0;
//                    }
//                    return -1;  */
//                    return o1.getAge()-o2.getAge();//升序
//                    return o2.getAge()-o1.getAge();//降序
                    return o1.getName().compareTo(o2.getName()) ;// 按照姓名升序
//                    return o2.getName().compareTo(o1.getName()) ;// 按照姓名降序
                }
            });
            System.out.println("排序后:"+list);
        }  

    }
时间: 2024-11-05 11:38:13

根据list中对象的属性去重和排序小结的相关文章

java 对list中对象按属性排序

实体对象类 --略 排序类----实现Comparator接口,重写compare方法 package com.tang.list; import java.util.Comparator; public class Mycompera implements Comparator<Student> { @Override    public int compare(Student o1, Student o2) {        if (o1.getSid() > o2.getSid()

javascript中对象的属性的特性

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

Vue 改变数组中对象的属性不重新渲染View的解决方案

在解决问题之前,我们先来了解下 vue响应性原理: Vue最显著的一个功能是响应系统-- 模型只是一个普通对象,修改对象则会更新视图.受到javascript的限制,Vue不能检测到对象属性的添加或删除,因为vue在初始化实列时将属性转为getter/setter,所以属性必须在data对象上才能让vue转换它.但是vue可以使用 Vue.set(object, key, value)方法将响应属性添加到嵌套的对象上:如下代码: Vue.set(obj, '_isHover', true); 或

JavaScript中对象的属性

原文:http://www.2ality.com/2012/10/javascript-properties.html JavaScript中有三种不同类型的属性:命名数据属性(named data properties),命名访问器属性(named accessor properties)以及内部属性(internal properties). 命名数据属性 这种属性就是我们通常所用的"普通"属性,它用来将一个字符串名称映射到某个值上.比如,下面的对象obj有一个名为字符串"

java中对象,属性,和方法的关系?

5.object和Class的深入理解---属性和方法   (视频下载) (全部书籍) 抽象Abstract:[新手可忽略不影响继续学习]   (视频下载) (全部书籍)很多java 的书中都谈到了抽象abstract的概念,到底什么是抽象?马克-to-win:抽取关键相关特性(属性和方法)构成对象,用程序的方法逻辑和数据结构 属性模拟现实的世界对象.比如上节的例子,现实世界的计算机里的window很复杂,那么多像素,那么多颜色,那我们如何萃取出和我们相关的属性和方法完 成我们的客户的需求呢?这

记录,javascript中对象的属性名是字符串,却可以不用引号

问题描述:今日看书,里面介绍js的对象的属性名是包括空字符串在内的所以字符串 问题来了,我们平时定义的对象如下,是没有引号""or’'的 var someone  = {    first_name : “Jeo”,    second_name : “Mike”}; 所以我写了以下程序测试, var stooge = {    “first_name” : “Jeo”,    “second_name” : “Mike”};var copy = {    first_name : “

js中对象的属性名和属性值

代码 /** * 对象的属性名 * - 对象的属性名不强制遵循标识符的命名规范,可以是任意的名字,但在开发中 * 尽量遵循标识符的命名规范 */ // 创建对象obj1 var obj1 = new Object(); // 添加属性name obj1.name = "唐僧"; console.log(obj1); // {name: "唐僧"} /** * 如果要使用特殊的属性名,不能采用"."的方式来操作,需要使用另一种 * 方式: * 语法

c++中std::set自定义去重和排序函数

c++中的std::set,是基于红黑树的平衡二叉树的数据结构实现的一中容器,因为其中所包含的元素的值是唯一的,因此主要用于去重和排序.这篇文章的目的在于探讨和分享如何正确使用std::set实现去重和排序功能. 1.方法一:使用std::set内置的less比较函数(直接定义内置类型的set对象) 这种方法适用于:1)比较int.char等内置类型.2)只能针对某一个内置类型去重和排序:如果想通过id(int)去重,并通过hot(int)排序,该种方法就束手无策了.代码如下: 1 #inclu

java8 list中根据对象多属性去重

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan 原文地址:https://blog.csdn.net/zh15732621679/article/details/80483617 项目需求描述 出于项目需要,有一个list,实体包含多个字段,当其中两个字段相同均相同时,就认为list中的两条记录是一样的,本来想通过分组实现,java8的分组只提供根据一个字段分组,只好另寻他路,java8有一个collectingAndThen可以根据多个字