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 个兴趣,有什么方法可以解决这个问题以及更好、更干净的方法吗?
这里要考虑的不是过滤机制,而是使用的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)