1

大家好,我从来没有写过比较器 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));
        }
    }
4

3 回答 3

1

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

于 2010-03-07T16:58:29.643 回答
1

那不是 Comparator 类。那是一个实现 Comparable 的 Name 类。

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

于 2010-03-08T00:24:04.317 回答
0

比较器用于对列表进行排序。A Hashtable(注意大小写)不是按其元素排序的。你可以通过迭代它的键来订购一个表(如果你想在它的键上订购,我想)并将它们放在一个List. 接下来要做的是对 进行排序List和迭代List,并使用getoutHashtable来获取其关联值。

这是一个示例(使用HashMap,因为它与 Java 集合的其余部分更加集成。AHashMap本质上与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,那么它会抛出一个异常(因为它会强制转换为 a Comparator

于 2010-03-07T17:00:08.860 回答