我在使用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个兴趣,有没有办法解决这个问题以及更好,更清洁的方法呢?
答案 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");