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

Categorize objects in different lists depending on a property

我在使用 interest 属性.

对不同列表中的对象进行分类时遇到问题

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

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个兴趣,有什么方法可以解决这个问题以及更好,更干净的方法吗?

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

在这种情况下,您分配不同类型的 users 具有一定的兴趣 (key)。这是 maps.

的完美用例

我认为你只需要在以下情况下使用地图。

The problem in the above that I'm restricted to only 3 interests, Is there any way to solve this problem

当然你可以根据自己的兴趣分类,看看下面的方法:

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;
    }

Is there a better, cleaner way to do it?

是的,使用 Java 8 Streams 你可以很容易地用一行代码重写上面的内容:

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

这是使用 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");