请问java 结果集list<user>,根据user.name属性,如何再将name属性相同的user放到一个新的list中?

请问java 结果集list<user>,根据user.name属性,如何再将结果集中的name属性相同的user放到一个新的list中?
user的name可能多个,不固定,根据name将user放到不同新的的list

阅读 6.8k
6 个回答

拿来练习下RxJava

List<User> all = getUserList();
Observable.from(all)
          .groupBy(u -> u.name)
          .flatMap(g -> g.toList())
          .subscribe(list -> {
              System.out.println(list.get(0).name + ":");
              for (User u : list) {
                  System.out.println(u);
              }
              System.out.println();
          });

直接写点代码了
`

public class MyTest {
    class User{
        String name;
        int age;
        public User(String name,int age) {
            this.name = name;
            this.age = age;
        }

    }

    public static void main(String[] args) {
        MyTest myTest = new MyTest();
        List<User> users = new ArrayList<>();
        User user1 = myTest.new User("zhangsan", 18);
        User user2 = myTest.new User("lisi", 18);
        User user3 = myTest.new User("wangwu", 18);
        User user4 = myTest.new User("zhangsan", 19);
        User user5 = myTest.new User("zhangsan", 20);
        User user6 = myTest.new User("lisi", 19);

        users.add(user1);
        users.add(user2);
        users.add(user3);
        users.add(user4);
        users.add(user5);
        users.add(user6);
        /*根据name将user放到不同新的的list*/
        Map map = new HashMap<String,List<User>>();
        for (User user : users){
            //如果map中不存此name,则以此name为key
            if(map.get(user.name) == null ){
                List list = new ArrayList<User>();
                list.add(user);
                map.put(user.name,list);
            }else{
                List list = (List<User>) map.get(user.name);
                list.add(user);
                map.put(user.name,list);
            }
        }
        List<User> zhangsans = (List<User>)map.get("zhangsan");
        for (User user : zhangsans){
            System.out.println(user.name+"  :  "+user.age);
        }
        System.out.println(map.get("zhangsan"));
    }
}

`

new List<user>()不就好了?

使用 Map<String,List<User>>, name 作为key ,遍历原list 并且根据name 获取 对应的 list 把 user 添加进去,如果不存在就创建并保存到 Map 中。
手机码字不便… 将就着看吧…

java8

List<User> users = ...;
Map<String, List<User>> usersGroupByName = users.stream().collect(Collectors.groupingBy(User::getName));

guava

/**
 * 根据函数 O->K和O->V 把 O[] 转化为 {K -> V[]}的Multimap
 */
public static <O, K, V> ArrayListMultimap<K, V> newMultimapWithValue(Collection<? extends O> coll, Function<O, K> objToKeyFunction, Function<O, V> objToValueFunction) {
    // 可以根据需求把ArrayListMultimap换成HashMultimap或TreeMultimap
    ArrayListMultimap<K, V> result = ArrayListMultimap.create();
    if (coll == null || coll.isEmpty()) {
        return result;
    }
    for (O obj : coll) {
        K key = objToKeyFunction.apply(obj);
        V value = objToValueFunction.apply(obj);
        result.put(key, value);
    }
    return result;
}

List<User> users = ...;
ArrayListMultimap<String, User> usersGroupByName = newMultimapWithValue(users, User::getName, v -> v);

参考资料:

ifeve.com/google-guava/

GoldyMark的Java8的写法不错,非常简洁。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题