Некоторые ароматы regex могут на самом деле соответствовать вложенным скобкам (например, Perl совместимые). Однако я видел regex, который утверждает, что правильно соответствовал RFC 822, и это были две страницы текста без любого пробела. Поэтому лучший способ обнаружить адрес действующего адреса электронной почты состоит в том, чтобы послать электронное письмо ему и видеть, работает ли это.
Вы не можете, так как компаратор TreeMap работает только с ключами, например, см. Этот конструктор .
В любом случае, вы можете использовать несколько коллекций, используйте TreeMap (или скорее HashMap) для поиска элементов по ключам, и иметь SortedSet для перебора значений.
Google Guava предоставляет TreeMultiMap .
Вы также можете использовать две коллекции. Что вы пытаетесь достичь? Вы можете объяснить свои варианты использования?
Поменять местами значения и ключи
А если серьезно, пожалуйста, укажите в контексте, чего вы хотите достичь. Может быть, достаточно отсортировать после завершения другой обработки.
Вы можете попробовать дать компаратор, который сравнивает значения вместо ключей при создании TreeMap.
final TreeMap<Integer,String> tree = new TreeMap<Integer,String>();
tree.put(1, "1");
tree.put(2, "2");
tree.put(3, "3");
tree.put(4, "4");
final TreeMap<Integer,String> treeSortedByValues = new TreeMap<Integer,String>(new Comparator<Integer>()
{
public int compare(Integer o1, Integer o2)
{
return tree.get(o1).compareTo(tree.get(o2));
}
});
treeSortedByValues.putAll(tree);
for ( Entry<Integer, String> e : treeSortedByValues.entrySet() )
{
System.out.println(e.getKey() + ": " + e.getValue());
}
Коллекции Apache Commons имеют TreeBidiMap :
Этот класс гарантирует, что отображение будет в порядке возрастания клавиш и в порядке возрастания значений, отсортировано в соответствии с естественным порядком для классы ключей и значений.
Здесь есть порт для Java5-generics здесь .
Вот решение:
public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = new Comparator<K>() {
public int compare(K k1, K k2) {
int compare = map.get(k2).compareTo(map.get(k1));
if (compare == 0) return 1;
else return compare;
}
};
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
Обратите внимание, что карта отсортирована от наибольшего значения до самого низкого.