Unfortunately you probably will not find a structure that supports multiple values of the same keys. As Dilum said, there are several implementations of "MultiMap" or "Multi-Valued Maps" that would work well.
In addition to Guava's TreeMultiMap, there's also the Spring Framework's MultiValueMap and Apache Common's MultiValueMap.
An example of the Spring implementation would be:
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
public class MultiValueMapExample {
public static void main(String[] args) {
// 10-a, 10-b, 9-c, 8-d, 8-e, 8-f, 4-g, 4-h, 2-i
MultiValueMap<Integer, String> map = new LinkedMultiValueMap<Integer, String>();
map.add(10, "a");
map.add(10, "b");
map.add(9, "c");
map.add(8, "d");
map.add(8, "e");
map.add(8, "f");
map.add(8, "g");
map.add(4, "h");
map.add(2, "i");
System.out.println(map.toString());
// {10=[a, b], 9=[c], 8=[d, e, f, g], 4=[h], 2=[i]}
}
}
You could use this by adding Spring-Core via the following Maven dependency:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
If you need help getting any of these libs in your project, feel free to comment / contact me.
Update 1
Turns out there's not a convenient way to filter / sort from the raw API's. I've included a simple filter function below that should do the trick.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
public class MultiValueMapExample {
public static void main(String[] args) {
// 10-a, 10-b, 9-c, 8-d, 8-e, 8-f, 4-g, 4-h, 2-i
MultiValueMap<Integer, String> map = new LinkedMultiValueMap<Integer, String>();
map.add(8, "g");
map.add(4, "h");
map.add(10, "a");
map.add(10, "b");
map.add(9, "c");
map.add(8, "d");
map.add(8, "e");
map.add(8, "f");
map.add(2, "i");
System.out.println(map.toString());
// {8=[g, d, e, f], 4=[h], 10=[a, b], 9=[c], 2=[i]}
MultiValueMap<Integer, String> filteredMap = filter(5, map);
System.out.println( filteredMap.toString() );
// {10=[a, b], 9=[c], 8=[g, d, e, f], 4=[h], 2=[i]}
}
public static MultiValueMap<Integer, String> filter(int numberOfResults, MultiValueMap<Integer, String> map){
MultiValueMap<Integer, String> result = new LinkedMultiValueMap<Integer, String>();
List<Integer> keys = new ArrayList<Integer>(map.keySet());
Collections.sort(keys, Collections.reverseOrder());
for(Integer key : keys){
if( result.size() <= numberOfResults ){
result.put(key, map.get(key));
}else{
break;
}
}
return result;
}
}
Mapwith aListof values would correlate to one Key with multiple Values--I believe I can store theMaps in an ArrayList, correct?HashMapalso overwrites duplicate keys. I suspect that's not what you really mean? Also, you say ascending order of keys, but your example is in descending order? Did you mean descending order of keys and ascending order of values?