There doesn't really exist any data structure that could do this efficiently: you have to maintain a data structure that makes it efficient to look up by keys, and sorting the values makes it more difficult to maintain that structure.
If you don't modify the map after it's created, though, then you could do something like this:
List<Map.Entry<Key, Value>> list = new ArrayList<Map.Entry<Key, Value>>(
map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Key, Value>>() {
public int compare(Map.Entry<Key, Value> e1, Map.Entry<Key, Value> e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
Map<Key, Value> sortedByValues = new LinkedHashMap<Key, Value>();
for (Map.Entry<Key, Value> entry : list) {
sortedByValues.put(entry.getKey(), entry.getValue());
}
The resulting LinkedHashMap would iterate in sorted value order.