根据属性对不同列表中的对象进行分类

gal*_*kon 4 java logic list arraylist categories

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

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

class User {
    private int id;
    private String name;
    private String interest;
    //constructors, getters & setters etc...
}
Run Code Online (Sandbox Code Playgroud)

我试图根据某种兴趣显示用户,但我觉得除了我尝试过的方法之外,还有一种更简单的方法可以做到这一点。

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

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的问题是我仅限于 3 个兴趣,有什么方法可以解决这个问题以及更好、更干净的方法吗?

Ahm*_*nie 5

这里要考虑的不是过滤机制,而是使用的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;
    }
Run Code Online (Sandbox Code Playgroud)

有没有更好、更干净的方法来做到这一点?

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

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