构造函数接受两个数组,我想将它们放入我的HashMap中,但是如果地图已经包含来自其中一个数组的单词,那么我想抛出一个异常。除非重复术语是数组术语中的最后一个术语,否则此方法有效。为什么会这样呢?

private HashMap<String, Double> wordToWgt = new HashMap<String, Double>();
private TST t = new TST();
double maxWeight = 0.0;
private String maxWord = "";
public Autocomplete(String[] terms, double[] weights) {
    if (terms.length != weights.length) {
        throw new IllegalArgumentException();
    }
    else {
        for (int i = 0; i < terms.length; i++) {
            if (weights[i] < 0) {
                throw new IllegalArgumentException();
            }
            else if (wordToWgt.containsKey(terms[i])) {
                throw new IllegalArgumentException();
            }
            else if (weights[i] > maxWeight) {
                maxWeight = weights[i];
                maxWord = terms[i];
            }
            t.insert(terms[i], weights[i]);
            wordToWgt.put(terms[i], weights[i]);
        }
    }


// System.out.println(wordToWgt.keySet());
    }

最佳答案

我看不到您的代码有什么问题,因此,我将提出一些替代解释。

您(我想)使用的输出

 System.out.println(wordToWgt.keySet());


告诉您有重复项。但是,keySet返回的密钥集是真实的集(在String.equals语义的上下文中)。因此,不能重复。

因此,您看到的重复项实际上是...根本不是重复项。那怎么可能?


其中一个字符串上可能有前导或尾随空格字符。这很容易错过。
这可能是一个homoglyph问题。


也可能是您/您的工具链没有正确地重建代码。即您正在运行的代码可能与您正在查看/编辑的源代码不匹配。



附言您仅在最后一个元素上看到了这一事实,这可能只是一个巧合,或者可能是生成输入字符串的方式的伪影。

09-30 21:04