List中去除某些对象某个字段的重复值

nxkid1412 2015-08-28 02:19:31
问题描述如下:
有一个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中
...全文
13046 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱吃火锅的S 2018-04-22
  • 打赏
  • 举报
回复
引用 12 楼 nxkid1412 的回复:
有道理,受教了! [quote=引用 11 楼 lonrence 的回复:]

int size = list.size();
        for(int i = 0;i < size;i++) {
        	if(i+1 < list.size()) {
        		User firstUser = list.get(i);
        		User lastUser = list.get(i+1);
        		if(firstUser.getUserId() == lastUser.getUserId()) {
        			firstUser.setName(firstUser.getName()+lastUser.getName());
        			list.set(i, firstUser);
        			list.remove(i+1);
        		}
        	} else break;
        }
这样的话,这个算法有点像冒泡排序,不过你的程序我觉得有2个问题 1、因为有相同id的时候,会删除元素,这样列表的size会变化,所以在循环中固定size不合适,应该是动态的 2、if(i+1 < list.size()) 可以省略,想象一下,即使都是不同的id,两两比较,只要比较list.size() -1次,所以下标从0开始,循环到list.size() -2就够了,下标不会越界
for(int i = 0;i < list.size() - 1;i++){
    		User firstUser = list.get(i);
            User lastUser = list.get(i+1);
            if(firstUser.getUserId() == lastUser.getUserId()) {
                firstUser.setName(firstUser.getName()+lastUser.getName());
                list.set(i, firstUser);
                list.remove(i+1);
            }
    	}
[/quote] 朋友,你这个写法也存在一点小问题,首先 假如我有三条id一样也就是需要合并的数据,list的size初始为3,第一次进入循环后,remove掉一条数据,list为2,此时i为1,进入循环的条件i < list.size() - 1 正好不满足,所以这里就出现了一点小问题了;也不知道过去这么久你还会回复我不。。。
nxkid1412 2015-08-31
  • 打赏
  • 举报
回复
有道理,受教了!
引用 11 楼 lonrence 的回复:

int size = list.size();
        for(int i = 0;i < size;i++) {
        	if(i+1 < list.size()) {
        		User firstUser = list.get(i);
        		User lastUser = list.get(i+1);
        		if(firstUser.getUserId() == lastUser.getUserId()) {
        			firstUser.setName(firstUser.getName()+lastUser.getName());
        			list.set(i, firstUser);
        			list.remove(i+1);
        		}
        	} else break;
        }
这样的话,这个算法有点像冒泡排序,不过你的程序我觉得有2个问题 1、因为有相同id的时候,会删除元素,这样列表的size会变化,所以在循环中固定size不合适,应该是动态的 2、if(i+1 < list.size()) 可以省略,想象一下,即使都是不同的id,两两比较,只要比较list.size() -1次,所以下标从0开始,循环到list.size() -2就够了,下标不会越界
for(int i = 0;i < list.size() - 1;i++){
    		User firstUser = list.get(i);
            User lastUser = list.get(i+1);
            if(firstUser.getUserId() == lastUser.getUserId()) {
                firstUser.setName(firstUser.getName()+lastUser.getName());
                list.set(i, firstUser);
                list.remove(i+1);
            }
    	}
  • 打赏
  • 举报
回复

int size = list.size();
        for(int i = 0;i < size;i++) {
        	if(i+1 < list.size()) {
        		User firstUser = list.get(i);
        		User lastUser = list.get(i+1);
        		if(firstUser.getUserId() == lastUser.getUserId()) {
        			firstUser.setName(firstUser.getName()+lastUser.getName());
        			list.set(i, firstUser);
        			list.remove(i+1);
        		}
        	} else break;
        }
这样的话,这个算法有点像冒泡排序,不过你的程序我觉得有2个问题 1、因为有相同id的时候,会删除元素,这样列表的size会变化,所以在循环中固定size不合适,应该是动态的 2、if(i+1 < list.size()) 可以省略,想象一下,即使都是不同的id,两两比较,只要比较list.size() -1次,所以下标从0开始,循环到list.size() -2就够了,下标不会越界
for(int i = 0;i < list.size() - 1;i++){
    		User firstUser = list.get(i);
            User lastUser = list.get(i+1);
            if(firstUser.getUserId() == lastUser.getUserId()) {
                firstUser.setName(firstUser.getName()+lastUser.getName());
                list.set(i, firstUser);
                list.remove(i+1);
            }
    	}
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class TestDemo1 {
	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));
		
		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();
			if(tempMap.containsKey(key)){
				User tempUser = new User(key,tempMap.get(key).getName() + user.getName(),tempMap.get(key).getAge());
				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;
    }
}

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 + "]";
	}
	
}
Cx_轩 2015-08-28
  • 打赏
  • 举报
回复
public class Test { public static void main(String[] args) { User u1 = new User(); u1.setId("1"); u1.setAge("22"); u1.setName("Cx"); User u2 = new User(); u2.setId("1"); u2.setAge("23"); u2.setName("cx"); List<User> list= new ArrayList<User>(); list.add(u1); list.add(u2); Collections.sort(list); for (int i = 0; i < list.size(); i++) { if(list.get(i).getId() == list.get(i+1).getId()){ list.remove(i); } } System.out.println(list); } } public class User implements Comparable<User>{ String id; String name; String age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } public User(String id, String name, String age) { super(); this.id = id; this.name = name; this.age = age; } public User() { super(); // TODO Auto-generated constructor stub } @Override public int compareTo(User o) { if(this.id.compareTo(o.getId())==0){ System.out.println("处理相等业务"); this.name = o.getName() + this.name; return 0; } return 0; } }
  • 打赏
  • 举报
回复
通过Map<Integer,User> ,key是id,value是User对象 遍历List 如果id不存在,put(id,user);如果存在,get(id),进行合并操作,将新的User对象put(id,user) 然后遍历Map 取出value
rushly 2015-08-28
  • 打赏
  • 举报
回复
1,用set嘛 ,重写equals hashCode方法。 2,新建一个类继承ArraryList 重写add方法
三仙半 2015-08-28
  • 打赏
  • 举报
回复
根据ID排序,在寻找最终位置时,会发现同ID的对象,此时做你需要的操作。
nxkid1412 2015-08-28
  • 打赏
  • 举报
回复
是这样的,这个list其实是从数据库查出得到的,这个ID其实是另一个实体的主属性,它俩关系是ManyToOne,现在想合并list里相同ID的对象的某些属性,保证list里不会出现相同ID的两个对象,其实就是把ManyToOne的关系通过两个List建立成OneToOne,我的思路是先将第一个list里重复ID的对象保留一个,合并属性,然后再和另一个List通过循环是两个List对应起来
引用 4 楼 u014264503 的回复:
我不太了解你这个user类是不是只允许有两个id一样。所有id一样是不是可以一样。还有我不了解id一样,age是不是可以一样。 我这里以只可以有两个id一样为例,age可以一样也可以不一样。
public class TestList {
  public static void main(String[] args) {
    List<User> users = new ArrayList<User>();
    List<User> newUsers = new ArrayList<User>();
    List<Integer> ids = new ArrayList<Integer>();
    User u1 = new User(99, "u1", 18);
    User u2 = new User(100, "u2", 14);
    User u3 = new User(100, "u3", 14);
    User u4 = new User(101, "u4", 13);
    User u5 = new User(101, "u5", 12);
    users.add(u1);
    users.add(u2);
    users.add(u3);
    users.add(u4);
    users.add(u5);
    
    boolean contain;
    for(int i = 0;i < users.size();i++){
      //假设取出一条数据后,后面有一样的id,num就+1,如果没有就把自己加在新的list中
      int num = 0;
      contain = ids.contains(users.get(i).getId());
      ids.add(users.get(i).getId());
      //在下一次循环的时候不考虑之前出现过得id
      if(contain == false){
        for(int j = i+1; j <= users.size() - 1;j++){
          int  id = users.get(i).getId();
          int  age = users.get(i).getAge();
          if(id == users.get(j).getId()){
            num ++;
            if(age == users.get(j).getAge()){
              String newName = users.get(i).getName() + users.get(j).getName();
              User newU = new User(id,newName,age);
              newUsers.add(newU);
            }else{
              String newName1 = users.get(i).getName() + users.get(j).getName();
              String ageStr1 =  users.get(i).getAge() + "" + users.get(j).getAge() + "";
              User newU = new User(id,newName1,Integer.parseInt(ageStr1));
              newUsers.add(newU);
            }
          }
        }
        if(num == 0){
          newUsers.add(users.get(i));
        }
      }
    }
    for(int k = 0; k < newUsers.size();k++ ){
      System.out.print("id:" + newUsers.get(k).getId() + "   ");
      System.out.print("name:" +  newUsers.get(k).getName() + "   ");
      System.out.print( "age:" + newUsers.get(k).getAge()+ "   ");
      System.out.println();
    }
    
  }
}

class User{
  int id;
  String name;
  int age;
  public User(int id,String name,int age){
    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;
  }
  
}
nxkid1412 2015-08-28
  • 打赏
  • 举报
回复
感谢提供用map的思路,这个方式很通用,其实我的需求还没这么复杂,就是对象集合里对象的ID最多只会有两个重复,而且重复ID的两个对象是紧挨着的,所以我用循环判断实现了:

int size = list.size();
        for(int i = 0;i < size;i++) {
        	if(i+1 < list.size()) {
        		User firstUser = list.get(i);
        		User lastUser = list.get(i+1);
        		if(firstUser.getUserId() == lastUser.getUserId()) {
        			firstUser.setName(firstUser.getName()+lastUser.getName());
        			list.set(i, firstUser);
        			list.remove(i+1);
        		}
        	} else break;
        }
不知道有没有什么漏洞。。。还是感谢你提供的思路,受教了!
引用 3 楼 lonrence 的回复:
通过Map<Integer,User> ,key是id,value是User对象 遍历List 如果id不存在,put(id,user);如果存在,get(id),进行合并操作,将新的User对象put(id,user) 然后遍历Map 取出value
引用 6 楼 lonrence 的回复:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class TestDemo1 {
	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));
		
		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();
			if(tempMap.containsKey(key)){
				User tempUser = new User(key,tempMap.get(key).getName() + user.getName(),tempMap.get(key).getAge());
				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;
    }
}

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 + "]";
	}
	
}
nxkid1412 2015-08-28
  • 打赏
  • 举报
回复
引用 2 楼 rushly 的回复:
1,用set嘛 ,重写equals hashCode方法。 2,新建一个类继承ArraryList 重写add方法
引用 5 楼 qq_25223941 的回复:
public class Test { public static void main(String[] args) { User u1 = new User(); u1.setId("1"); u1.setAge("22"); u1.setName("Cx"); User u2 = new User(); u2.setId("1"); u2.setAge("23"); u2.setName("cx"); List<User> list= new ArrayList<User>(); list.add(u1); list.add(u2); Collections.sort(list); for (int i = 0; i < list.size(); i++) { if(list.get(i).getId() == list.get(i+1).getId()){ list.remove(i); } } System.out.println(list); } } public class User implements Comparable<User>{ String id; String name; String age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } public User(String id, String name, String age) { super(); this.id = id; this.name = name; this.age = age; } public User() { super(); // TODO Auto-generated constructor stub } @Override public int compareTo(User o) { if(this.id.compareTo(o.getId())==0){ System.out.println("处理相等业务"); this.name = o.getName() + this.name; return 0; } return 0; } }
引用 7 楼 tianyutaizi 的回复:
重写User的hashcode和equals函数,继承HashMap类重写add方法(小改动,改动点就是遇到相同的key就累加name值)
谢谢你们提供的思路,不过不到万不得已不太想修改实体类,只想对这个对象集合本身进行操作,得到想要的List集合
-天宇 2015-08-28
  • 打赏
  • 举报
回复
重写User的hashcode和equals函数,继承HashMap类重写add方法(小改动,改动点就是遇到相同的key就累加name值)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧