2010-03-07 1 views
1

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

Hashtable <String, Objects> ht; 

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

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)); 
     } 
    } 
+0

Вам действительно нужно сравнить два экземпляра 'Hashtable' или два элемента, содержащихся в хэш-таблице? –

+0

Это примерно в 100 раз дольше, чем любой компаратор, который я когда-либо писал. Зачем вам нужен компаратор? Что заставляет вас думать, что вы делаете? Как выглядят ваши ключи? – Pointy

+0

Вы действительно внедрили свою собственную хэш-таблицу или используете 'java.util.Hashtable' с опечаткой в ​​вашем коде (' HashTable')? –

ответ

0

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

Вот пример (с использованием HashMap, так как это более интегрированной с остальной частью Java Collections 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)

+0

Привет, это фантастика, поэтому вы говорите, что вместо Hashtable используете Hashmap. Я не понимаю, почему вы используете связанный список? – user288245

+0

Поскольку ни «HashMap» (обратите внимание на случай M), ни «Hashtable» (малый t), «упорядочены». Таким образом, их элементы хранятся в полуслучайном порядке, чтобы повысить производительность. Я использую 'LinkedList', потому что я использую много' .add (f); ', а' LinkedList' оптимизирован для добавления/удаления. Затем «Список» упорядочивается с помощью 'Collections.sort'. Список имеет внутреннее представление порядка, он «упорядочен», и, следовательно, порядок ключей «HashMap» хранится в «List». Итерация над «списком» даст ключи в правильном порядке. – Pindatjuh

+0

Карта (HashMap) не упорядочивает свои элементы. Порядок ключей определяется хэш-значением ключевого объекта, поэтому вы не можете сортировать HashMap (или Hashtable). Пункт LinkedList состоит в том, чтобы упорядочить ключи вашего HashMap в алфавитном порядке, затем вы можете использовать этот упорядоченный список для получения связанных значений. Вы уверены, что Hashtable - это то, что вы хотите использовать? – DaveJohnston

1

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

+0

Значит, ты говоришь, что я бы не сделал хеш-таблицу? было бы что-то вроде дерева лучше? в основном у меня есть набор данных (в настоящее время в хеш-таблице), которые я хочу упорядочить по алфавиту – user288245

1

Это не класс компаратора. Это класс Name, который реализует Comparable.

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