2014-05-18 80 views
0

我有一个用户列表,他们有一个名字和一个年龄。我想将此列表分成子列表,其中每个列表包含具有特定年龄的所有用户。如何将集合拆分为子集合?

下面是一个例子一些代码:

public class User{ 
    public String name; 
    public int age; 
} 

User user1 = new User(); 
user1.setName("Tom"); 
user1.setAge("20"); 

User user2 = new User(); 
user2.setName("Jack"); 
user2.setAge("21"); 

User user3 = new User(); 
user3.setName("Peter"); 
user3.setAge("21"); 

List<User> userList = new ArrayList<User>(); 
userList.add(user1); 
userList.add(user2); 
userList.add(user3); 

我如何可以拆分userList所以列表1(持有用户年龄20)包含汤姆 和List2(持有用户21岁)包含杰克和彼得?

回答

3

它看起来像你想创建一个Map<Integer, List<User>>它将年龄映射到用户列表。

Map<Integer, List<User>> myMap = new HashMap<Integer, List<User>>(); 
for (User u: userList) { 
    if (!myMap.containsKey(u.age)) myMap.put(u.age, new ArrayList<User>()); 
    myMap.get(u.age).add(u); 
} 

如果你想迭代它们并打印出来,你可以像这样遍历Map。

for (Integer i : myMap.keySet()) { 
    System.out.print(i + ": "); 
    StringBuilder sb = new StringBuilder(); 
    for (User u: myMap.get(i)) 
     sb.append("," + u.name); 
    System.out.println(sb.toString().substring(1)); // Remove the first comma 
} 

输出:

21: Jack,Peter 
20: Tom 

请注意,如果你本来想Map通过age以迭代,可以替换HashMap上面TreeMap,以实现你的插入和访问将是O(log n)而不是O(1)

+0

他要为不同年龄 –

+0

@VD不同列表”,我只是改变了它。 – merlin2011

+0

+1相同:) –

1

使用地图与关键年龄和值用户列表如下

Map<Integer,List<User>> userMap = new HashMap<Integer,List<User>>(); 

Then, whenever you want to add a new age you put a new empty list and 
public void addNewAge(Integer age) { 
    userMap.put(age, new ArrayList<User>()); 
} 

When you want to add a user, you obtain the user list based on the age represented by a Integer. 
public void addUserToList(Integer age, User user) { 
    if(userMap.containsKey(age)) 
     userMap.get(age).add(user);   
} 

使地图上多一点的样子,这样它会安慰你。

0

如果您使用的是Java 8,你可以使用拉姆达对这个在这篇文章中所解释的 - >Java lambda sublist

如果你没有使用Java 8,那么我会还与Map实现去抱着年龄作为关键和列表作为价值。

0

如果你想使用流API来做到这一点,你可以使用GroupingBy收集:

Map<Integer, List<User>> groupedByAge = users.stream() 
    .collect(Collectors.groupingBy((u)->u.age)); 

List<User> age20 = groupedByAge.get(20); // contains Tom 
List<User> age21 = groupedByAge.get(21); // contains Jack, Peter 

如果你想超过一定年龄的所有用户,他们不是方便所有同年龄,您可以从地图上收集,或者你可以改变你groupingBy功能如下:

Map<Boolean, List<User>> groupedByAge = users.stream() 
    .collect(Collectors.groupingBy((u)->u.age>20)); 

List<User> ageUnder21 = groupedByAge.get(false); 
List<User> age21AndOver = groupedByAge.get(true);