有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java哈希表比较器问题

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

Hashtable <String, Objects> ht;

有人能告诉你如何为哈希表编写一个比较器吗?我见过的例子都是关于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));
        }
    }

共 (2) 个答案

  1. # 1 楼答案

    比较器会告诉你两个项目中哪个更大。如果这对你的哈希表有意义,只有你才能说出它的意义。以这种方式比较两个哈希表是非常不寻常的

  2. # 2 楼答案

    比较器用于对列表进行排序。A Hashtable(注意大小写)不是按元素排序的。您可以通过迭代表的键来对表进行排序(我想,如果您想对表的键进行排序的话),然后将它们放在List中。接下来要做的事情是对List进行排序,并在List上迭代,然后从Hashtable中使用一个get来获得它的关联值

    下面是一个例子(使用HashMap,因为它与其他Java集合更为集成。A 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类排序。它将按字母顺序排序,这是字符串的默认值。你可以使用你自己的关键对象,就像你提到的。如果没有在这个key对象中实现Comparator,那么可以提供,如上面的示例所示。否则,您可以通过调用以下命令使用默认Comparator

    Collections.sort(keys);
    

    它将使用Comparator的类实现。如果它没有实现Comparator,那么它将抛出一个异常(因为它将强制转换为Comparator