根据list中对象的属性去重和排序小结(必看篇)

所属分类: 软件编程 / java 阅读数: 31
收藏 0 赞 0 分享

如下所示:

//去重
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); 
    } 

  }

以上这篇根据list中对象的属性去重和排序小结(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多