Сравните 2 ключа в Java HashMap - PullRequest
2 голосов
/ 13 марта 2011

Я сделал BinaryTree< HashMap<String, String> >.

Как сравнить два ключа, чтобы я мог правильно вставить два элемента (HashMaps) в заказанное BinaryTree? Вот что у меня так далеко:

public class MyMap<K extends Comparable<K>, V> extends HashMap<K, V> implements Comparable< MyMap<K, V> >
{

    @override
    public int compareTo(MyMap<K, V> mapTwo)
    {
        if ( (this.keySet().equals(mapTwo.keySet())) ) return 0;
        //How can I check for greater than/less than and keep my generics?  

    }

РЕДАКТИРОВАТЬ: В каждом HashMap есть только один ключ (это очень простая система языкового перевода), поэтому сортировка ключей не требуется. Мне бы хотелось использовать метод String.compareTo(), но из-за моих обобщений компилятор не знает, что K является String

1 Ответ

3 голосов
/ 13 марта 2011

Я думаю, что вы выбрали неверную структуру данных.

HashMaps не упорядочены естественным образом.Ключи в наборе для HashMap имеют непредсказуемый порядок, который чувствителен к последовательности операций, которые заполняли карту.Это делает его непригодным для сравнения двух HashMaps.

Чтобы сравнить пару HashMaps, вам нужно извлечь соответствующие наборы ключей, отсортировать их и затем сравнить отсортированные наборы.Другими словами, метод compareTo для HashSet производных классов будет в среднем O(NlogN).


FWIW, реализация compareTo будет выглядеть примерно так, при условии, чтоМетод состоит в том, чтобы упорядочить HashMaps на основе отсортированных списков ключей в их соответствующих наборах ключей.Очевидно, что существуют другие упорядочения, основанные на наборах ключей.

public int compareTo(MyMap<K, V> other) {
    List<K> myKeys = new ArrayList<K>(this.keySet());
    List<K> otherKeys = new ArrayList<K>(other.keySet());
    Collections.sort(myKeys);
    Collections.sort(otherKeys);
    final int minSize = Math.min(myKeys.size(), otherKeys.size());
    for (int i = 0; i < minSize; i++) {
        int cmp = myKeys.get(i).compareTo(otherKeys.get(i));
        if (cmp != 0) {
            return cmp;
        }
    }
    return (myKeys.size() - otherKeys.size());
}

Если на карте есть только одна пара ключ / значение, то вы должны заменить ее простым классом Pair<K,V>,Использование HashMap для представления одной пары - это безумие.

...