Hashtable比较器问题

时间:2010-03-07 16:43:43

标签: java hashtable comparator

大家好,我从来没有写过比较器b4,我有一个真正的问题。我已经创建了一个哈希表。

Hashtable <String, Objects> ht;

有人可以展示你如何为Hashtable写一个比较器吗?我见过的例子等于和所有事情,但我根本就没有线索。下面的代码不是我的,但我发现的一个例子,哈希表中的关键意味着我不能这样做,我想。

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

3 个答案:

答案 0 :(得分:1)

比较者会告诉你哪两个项目更大。如果这对您的HashTable有意义,那么只有您可以说出其含义。想要以这种方式比较两个HashTable是非常不寻常的。

答案 1 :(得分:1)

那不是比较类。这是一个实现Comparable的Name类。

Hashtable和Hashmap不使用Comparator或Comparable。如果你想要排序的键使用TreeMap。

答案 2 :(得分:0)

比较器用于对列表进行排序。 Hashtable(注意案例)不是由其元素排序的。你可以通过迭代它的键来订购一个表(如果你想在它的键上订购,我推测)并将它们放在List中。接下来要做的是对List进行排序并迭代List,并使用get中的Hashtable来获取其相关值。

以下是一个示例(使用HashMap,因为它与其他Java集合更加集成。HashMapHashtable基本相同。):

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