Java 多项式通过HashMap的导数。如何迭代HashMap<;学位,系数>;?

Java 多项式通过HashMap的导数。如何迭代HashMap<;学位,系数>;?,java,performance,time,iterator,hashmap,Java,Performance,Time,Iterator,Hashmap,我想写一个多项式的求导方法。我的输入格式是存储度和系数的HashMap。如果多项式有很多零系数,这种方法(与数组类型输入相比)在空间方面更好,但是根据我的代码,我需要迭代n次,其中n是多项式的次数,而不是哈希集的大小。与1+x^100一样,HashMap大小为2,但度数为100。为了降低时间复杂度,我只需要在HashSet上进行计算。我们可以将迭代次数从n减少到HashMap大小吗?这是我的密码: public static HashMap<Integer, Double> deri

我想写一个多项式的求导方法。我的输入格式是存储度和系数的HashMap。如果多项式有很多零系数,这种方法(与数组类型输入相比)在空间方面更好,但是根据我的代码,我需要迭代n次,其中n是多项式的次数,而不是哈希集的大小。与1+x^100一样,HashMap大小为2,但度数为100。为了降低时间复杂度,我只需要在HashSet上进行计算。我们可以将迭代次数从n减少到HashMap大小吗?这是我的密码:

public static HashMap<Integer, Double> derivativePoly2(HashMap<Integer, Double> degreeAndCoeff) {
    int len = degreeAndCoeff.size();
    int i = 0;
    while (i < Integer.MAX_VALUE && len - 1 > 0) {
        if (degreeAndCoeff.containsKey(i + 1)) {
            --len;
            degreeAndCoeff.put(i, degreeAndCoeff.get(i + 1) * (i + 1));
            degreeAndCoeff.remove(i + 1);
        }
        ++i;
    }

    return degreeAndCoeff;

}
publicstatichashmap-derivativePoly2(HashMap-degreeAndCoeff){
int len=degreeAndceff.size();
int i=0;
而(i0){
如果(除油效率为(i+1)){
--len;
degreeandceff.put(i,degreeandceff.get(i+1)*(i+1));
去除除油效果(i+1);
}
++一,;
}
返回度dCEFF;
}

HashMap
不会为您提供密钥排序(我相信这就是您在本例中需要的)

是一个将具有键排序的类。然后您可以像这样迭代:

for(Map.Entryp<Integer, Double> entry : degreeAndCoeff.entrySet()) {
  Integer key = entry.getKey();
  Double value = entry.getValue();
}
for(Map.Entryp条目:degreeAndceff.entrySet()){
整数key=entry.getKey();
Double value=entry.getValue();
}

编辑:正如John Bollinger在评论中所建议的,在计算导数时,键的顺序并不重要,因此您可以简单地迭代
哈希映射
,与我在上面用
树映射
演示的方法完全相同

您可以使用条目集或键集的迭代器。例如:

public static Map<Integer, Double> derivativePoly2(Map<Integer, Double> degreeAndCoeff) {
    Map<Integer, Double> result = new HashMap<Integer, Double>();

    for (Map.Entry<Integer, Double> term : degreeAndCoeff.entrySet() {
        int exponent = term.getKey();
        double coefficient = term.getValue();

        // ... result.put(something, somethingElse);
    }

    return result;
}
publicstaticmap-derivativePoly2(Map-degreeAndCoeff){
映射结果=新的HashMap();
对于(Map.Entry术语:degreeAndceff.entrySet()){
int exponent=term.getKey();
双系数=term.getValue();
//…结果。放(某物,某物);
}
返回结果;
}

正确的是,
HashMap
s的迭代顺序不容易从其键中预测。但是,一般来说,多项式的项可以在其导数的计算中以任何顺序进行处理。当我写这篇文章时:deggeriandcoeff.put(entry.getKey()-1,entry.getValue()*entry.getKey());它给出了一个错误。我想使用相同的HashMap就地执行。但是当我创建新的HashMap时,它确实可以工作。DeggeriandCoeff.put(entry.getKey()-1,entry.getValue()*entry.getKey()有什么问题?谢谢!在对其集合视图之一进行迭代时,您不能修改映射,否则迭代器将抛出
ConcurrentModificationException
。如果您愿意,在计算完导数后,可以执行
degreeAndCoeff.clear();degreeAndCoeff.putAll(结果);
在原始
映射中返回结果。