please help me to find out a solution to generate a sorted LinkedList<UserRequest>
from multiple requests (UserRequest(userId, timestamp)) in round robin/load balanced manner?
Lets say we have a multiple requests list (XY, where X:userId, Y:timestamp) from multiple users:
A1,A2,A3,B1,C4,C6....
how to sort that into:
A1,B1,C4, (oldest requests from all users)
A2,C6, (newer requests from all users)
A3??? (newest requests from all users)
I have already tried to use a LinkedHashMap<userid, LinkedList<timestamp>>
but haven't achieved something efficient for days now:
@Test
public void testRequestSorting() throws Exception {
Collection<UserRequest> userRequests = new LinkedList<>(Arrays.asList(
new UserRequest("A", 1),
new UserRequest("A", 2),
new UserRequest("A", 3),
new UserRequest("B", 1),
new UserRequest("C", 4),
new UserRequest("C", 6)
));
Map<String, LinkedList<Long>> groups = new LinkedHashMap<>();
for (UserRequest userRequest : userRequests) {
LinkedList<Long> group = groups.get(userRequest.getUserId());
if (group == null) {
group = new LinkedList<>();
groups.put(userRequest.getUserId(), group);
}
group.add(userRequest.getTimestamp());
}
LinkedList<UserRequest> sortedRequests = new LinkedList<>();
while (!groups.isEmpty()) {
for (Iterator<String> iterator = groups.keySet().iterator(); iterator.hasNext();){
String userId = iterator.next();
LinkedList<Long> timestamps = groups.get(userId);
if (!timestamps.isEmpty()) {
Long first = timestamps.getFirst();
sortedRequests.add(new UserRequest(userId, first));
timestamps.remove(0);
if (timestamps.isEmpty()) {
iterator.remove();
}
}
}
}
for (UserRequest sortedRequest : sortedRequests) {
System.out.println(sortedRequest.getUserId() + "->" + sortedRequest.getTimestamp());
}
}
class UserRequest {
private final String userId;
private final long timestamp;
public UserRequest(String userId, long timestamp) {
this.userId = userId;
this.timestamp = timestamp;
}
public String getUserId() {
return userId;
}
public long getTimestamp() {
return timestamp;
}
}