2014-05-18 120 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);