根据属性

时间:2017-12-09 12:30:04

标签: java list arraylist logic categories

我在使用interest属性对不同列表中的对象进行分类时遇到问题。

我有一个用户列表作为List,我的用户类如下所示:

class User {
    private int id;
    private String name;
    private String interest;
    //constructors, getters & setters etc...
}

我试图根据某种兴趣显示用户,但我觉得除了我尝试过的事情之外,还有更简单的方法。

除了在switch中使用一组固定的元素之外,我还需要兴趣列表是动态的,而且我也不知道是否有更好更有效的方法而不必使用3 lists每个兴趣的列表。

这是我到目前为止所做的事情:

List<User> javaInterestList;
List<User> javascriptInterestList;
List<User> cInterestList;

public void category(List<User> unfilteredList) {
    for (User u : unfilteredList) {
        String interest = u.getInterest().toLowerCase();
        switch (interest) {
        case "java":
            javaInterestList.add(u);
            break;
        case "c":
            cInterestList.add(u);
            break;
        case "javascript":
            javascriptInterestList.add(u);
            break;
        }
    }
}

上面的问题我只限于3个兴趣,有没有办法解决这个问题以及更好,更清洁的方法呢?

2 个答案:

答案 0 :(得分:2)

这里要考虑的不是过滤机制,而是使用data-structure

在这种情况下,您正在分配具有特定兴趣(users)的不同类型的key。这是地图的完美用例。

我认为您只需要使用地图来处理以下情况。

  

上面的问题我只限于3个兴趣,有没有办法解决这个问题

当然,您可以根据需要对兴趣进行分类,请看以下方法:

public static Map<String,List<User>> category(List<User> unfilteredList){
        Map<String,List<User>> result = new HashMap<>();
        for(User u :unfilteredList){
            String inerest = u.getInterest();
            if(result.containsKey(u.getInterest())){
                List<User> users = new ArrayList<>(result.get(inerest));
                users.add(u);
                result.put(inerest, users);
            }else{
                List<User> users = new ArrayList<>();
                users.add(u);
                result.put(inerest, users);
            }
        }
        return result;
    }
  

有更好,更清洁的方法吗?

是的,使用Java 8 Streams,您只需在一行代码中轻松重写上述内容:

public static  Map<String,List<User>> category(List<User> unfilteredList){
        return unfilteredList.stream().collect(Collectors.groupingBy(u -> u.getInterest()));
    }

答案 1 :(得分:1)

这是使用groupingBy收藏家的绝佳机会。

Map<String, List<User>> resultSet = 
           unfilteredList.stream().collect(
                  Collectors.groupingBy(u -> u.getInterest().toLowerCase());

现在您可以通过执行以下操作检索给定密钥的用户列表:

List<User> java = resultSet.get("java");
List<User> c = resultSet.get("c");
List<User> javascript = resultSet.get("javascript");