0

我想在地图中获得距离,但我一直得到java堆错误......我不明白为什么甚至特别是当数据存储在地图中。Java堆错误

这里是我的代码:

Map<Integer, double[]> getDistanceTable(Map<String, Double[]> vectors) { 
    Map<Integer, double[]> distance = new HashMap<>(); 
    int size = vectors.keySet().size(); 
    for(int i=0; i<vectors.keySet().size(); i++) { 
     double[] features = new double[size]; 
     int index = 1; 
     features[0] = 0; 
     for(int j = i+1; j<vectors.keySet().size(); j++) {     
      features[index] =new QueryClustering().getDistance(vectors.get(i), vectors.get(j)); 
      index++; 
     } 
     distance.put(i, features); 
     size--; 
    }  
    return distance; 

} 
} 
+0

也许是因为新QueryClustering()getDistance的返回一个大对象,你必须在这种类型的太多的实例。无法放入堆中的映射 –

+0

请勿在每次迭代中创建新的QueryClustering对象。尝试在任何'for'之外创建它,并在'for'子句中调用方法getDistance(...)。 –

+0

请您提供更多详细信息,包括确切的错误信息?我可以看到的一个(无关的)问题是你正在做'vectors.get(i)'。 'i'是一个'int',但'vectors'的关键类型是'String'。 –

回答

0

请尝试用这个修改:

Map<Integer, double[]> getDistanceTable(Map<String, Double[]> vectors) { 

    // Define it once, call it multiple times inside 'for' clause: 
    QueryClustering queryClustering = new QueryClustering(); 

    Map<Integer, double[]> distance = new HashMap<>(); 
    int size = vectors.keySet().size(); 
    for(int i=0; i<vectors.keySet().size(); i++) { 
     double[] features = new double[size]; 
     int index = 1; 
     features[0] = 0; 
     for(int j = i+1; j<vectors.keySet().size(); j++) {     
      features[index] = queryClustering.getDistance(vectors.get(i), vectors.get(j)); 
      index++; 
     } 
     distance.put(i, features); 
     size--; 
    }  
    return distance; 
} 
+0

感谢但仍然错误保持,没有任何改变:( – Ffm

+0

@Nicolas Filotto有超过100,000个按键,每个按键都有一个Double [],其中有16个值 – Ffm

+0

@Adnan:我们将继续改进代码。在int上替换Integer类似于: Map distance = new HashMap (); 请保持最新改进(QueryClustering创建外部'for'子句)。 –