Проблема компаратора хеш-таблиц

Привет, ребята, я никогда не писал компаратор b4, и у меня возникла реальная проблема. Я создал хеш-таблицу.

Hashtable <String, Objects> ht;

Может ли кто-нибудь показать, как написать компаратор для Hashtable? примеры, которые я видел, переопределяют equals и все такое, но я просто понятия не имею. Код ниже не мой, но пример, который я нашел, ключевая вещь в хеш-таблицах означает, что я не могу сделать это так, я думаю.

 public class Comparator implements Comparable<Name> {
        private final String firstName, lastName;

        public void Name(String firstName, String lastName) {
            if (firstName == null || lastName == null)
                throw new NullPointerException();
        this.firstName = firstName;
            this.lastName = lastName;
        }

        public String firstName() { return firstName; }
        public String lastName()  { return lastName;  }

        public boolean equals(Object o) {
            if (!(o instanceof Name))
                return false;
            Name n = (Name)o;
            return n.firstName.equals(firstName) &&
                   n.lastName.equals(lastName);
        }

        public int hashCode() {
            return 31*firstName.hashCode() + lastName.hashCode();
        }

        public String toString() {
        return firstName + " " + lastName;
        }

        public int compareTo(Name n) {
            int lastCmp = lastName.compareTo(n.lastName);
            return (lastCmp != 0 ? lastCmp :
                    firstName.compareTo(n.firstName));
        }
    }

person user288245    schedule 07.03.2010    source источник
comment
Вам действительно нужно сравнить два экземпляра Hashtable или два элемента, содержащихся в хеш-таблице?   -  person Péter Török    schedule 07.03.2010
comment
Это примерно в 100 раз дольше, чем у любого компаратора, который я когда-либо писал. Зачем вообще нужен компаратор? Что заставляет вас думать, что вы делаете? Как выглядят ваши ключи?   -  person Pointy    schedule 07.03.2010
comment
Вы действительно реализовали свою пользовательскую хеш-таблицу или используете java.util.Hashtable с опечаткой в ​​коде (HashTable)?   -  person Péter Török    schedule 07.03.2010
comment
Да, извините, так что привык к верблюду, используя Hashtable. Я просто сравниваю элементы коллекции по алфавиту   -  person user288245    schedule 07.03.2010
comment
Что именно вы пытаетесь сделать, то есть что, как вы надеетесь, теперь это позволит вам делать? Ответьте на вопрос, и мы сможем вам помочь!   -  person Cam    schedule 07.03.2010
comment
Для тех, кому может быть интересно, я исправил опечатку, упомянутую выше.   -  person Péter Török    schedule 07.03.2010


Ответы (3)


Компараторы используются для сортировки списка. Hashtable (обратите внимание на случай) не упорядочен по элементам. Вы можете упорядочить таблицу, перебирая ее ключи (в случае, если вы хотите упорядочить ее ключи, я полагаю) и поместить их в List. Следующее, что нужно сделать, это отсортировать List и выполнить итерацию по List, а также использовать get из Hashtable, чтобы получить связанное с ним значение.

Вот пример (с использованием HashMap, так как он более интегрирован с остальными коллекциями Java. HashMap по существу такой же, как Hashtable.):

public static void main(String... arg) {
    HashMap<String, Object> x = new HashMap<String, Object>();
    x.put("second", " ordered!");
    x.put("first", "Correctly");

    LinkedList<String> keys = new LinkedList<String>();
    for(final String f : x.keySet()) {
        keys.add(f);
    }
    Collections.sort(keys, new Comparator<String>() {
        public int compare(String first, String second) {
            // return -1 is "first <  second"
            // return 1  is "first >  second"
            // return 0  is "first == second"
            return first.compareTo(second);
        }
    });

    for(final String f : keys) {
        System.out.print(x.get(f));
    }
    System.out.println();
}

Порядок списка keys сортируется по анонимному классу Comparator. Он будет сортироваться в алфавитном порядке, как по умолчанию для строк. Вы можете использовать свой собственный ключевой объект, как вы упомянули. Если вы не реализуете Comparator в этом ключевом объекте, вы можете поставить, как в приведенном выше примере. В противном случае вы можете использовать Comparator по умолчанию, вызвав:

Collections.sort(keys);

Который будет использовать реализацию классов Comparator. Если он не реализует Comparator, то он выдаст исключение (поскольку он будет приведен к Comparator)

person Pindatjuh    schedule 07.03.2010
comment
Привет, это фантастика, так что вы говорите использовать Hashmap вместо Hashtable. Я не понимаю, почему вы используете связанный список? - person user288245; 07.03.2010
comment
Потому что ни HashMap (обратите внимание на букву М), ни Hashtable (маленькая t) не упорядочены. Таким образом, их элементы хранятся в полуслучайном порядке для повышения производительности. Я использую LinkedList, потому что часто использую .add(f);, а LinkedList оптимизирован для добавления/удаления. Затем List упорядочивается с помощью Collections.sort. Список имеет внутреннее представление порядка, он упорядочен, поэтому порядок ключей HashMap хранится в List. Итерация по List даст ключи в правильном порядке. - person Pindatjuh; 07.03.2010
comment
Карта (HashMap) не упорядочивает свои элементы. Порядок ключей определяется хэш-значением ключевого объекта, поэтому вы не можете сортировать HashMap (или Hashtable). Пункт LinkedList состоит в том, чтобы упорядочить ключи вашего HashMap в алфавитном порядке, затем вы можете использовать этот упорядоченный список для получения связанных значений. Вы уверены, что Hashtable действительно то, что вы хотите использовать? - person DaveJohnston; 07.03.2010
comment
Если вы хотите упорядочивать по ключам, почему бы не использовать TreeMap? Карта sortedMap = new TreeMap (comparatorInstance); sortedMap.putAll (хэш-карта); Или еще лучше, используйте карту дерева с самого начала. - person ILMTitan; 08.03.2010

Компаратор скажет вам, какой из двух предметов больше. Если это имеет значение для вашей HashTable, только вы можете сказать, что это значит. Было бы очень необычно сравнивать две HashTable таким образом.

person Carl Manaster    schedule 07.03.2010
comment
Так вы говорите, что я не должен был делать хеш-таблицу? что-то вроде набора деревьев было бы более подходящим? в основном у меня есть набор данных (в настоящее время в хеш-таблице), которые я хочу расположить в алфавитном порядке - person user288245; 07.03.2010

Это не класс Comparator. Это класс Name, реализующий Comparable.

Hashtable и Hashmap не используют Comparator или Comparable. Если вам нужны отсортированные ключи, используйте TreeMap.

person user207421    schedule 08.03.2010