Java 在解析所有元素之前,如何使其循环?
我有一个包含6个元素的hashmap,如下所示 我有 -E:[x1:0.4,x2:0.5,x3:0.56,x4:0.45]- 我要做的是覆盖每个元素,直到E为空 这里的问题是,它检索第一个min并停止,但是E hashmap仍然包含元素,我缺少的是什么 HashMap E=新HashMap();//并不是说E不是空的,而是上面实例化的Java 在解析所有元素之前,如何使其循环?,java,loops,hashmap,hashset,Java,Loops,Hashmap,Hashset,我有一个包含6个元素的hashmap,如下所示 我有 -E:[x1:0.4,x2:0.5,x3:0.56,x4:0.45]- 我要做的是覆盖每个元素,直到E为空 这里的问题是,它检索第一个min并停止,但是E hashmap仍然包含元素,我缺少的是什么 HashMap E=新HashMap();//并不是说E不是空的,而是上面实例化的 HashSet<Integer> dataPoints = new HashSet(); //list of points for each xmin
HashSet<Integer> dataPoints = new HashSet(); //list of points for each xmin
HashMap<Integer, List<Integer>> clusters = new HashMap<>();
ArrayList<Integer> listt = new ArrayList<>();
List<Integer> l = new ArrayList<>(); //list of points for each xmin
System.out.println("size one :"+dataPoints.size());
while (!E.isEmpty()) {
int xMin = getKey(E, MinX(E, dataPoints));
dataPoints.add(xMin);
System.out.println("Xmin " + xMin);
E.remove(xMin);
//checking id X exists in data points if no return close elements
for (int j = 0; j < S.getRow(xMin).length; j++) {
if (S.getEntry(xMin, j) > beta) {
l.add(j);
dataPoints.add(j);
E.remove(j);
}
}
clusters.put(xMin, l);
HashSet dataPoints=newhashset()//每个xmin的点列表
HashMap clusters=新的HashMap();
ArrayList listt=新的ArrayList();
列表l=新的ArrayList()//每个xmin的点列表
System.out.println(“大小一:+dataPoints.size());
而(!E.isEmpty()){
intxmin=getKey(E,MinX(E,dataPoints));
dataPoints.add(xMin);
System.out.println(“Xmin”+Xmin);
E.移除(xMin);
//如果没有返回关闭元素,则检查数据点中是否存在id X
for(int j=0;jbeta){
l、 加(j);
数据点。添加(j);
E.移除(j);
}
}
簇。put(xMin,l);
这是Minx函数
public double MinX(ConcurrentMap<Integer, Double> e, HashSet<Integer> h) {
double tmpMin = 1;
//int Xmin = 0;
for (int k = 0; k < e.size(); k++) {
if ((e.get(k) < tmpMin) && (!h.contains(e.get(k)))) {
tmpMin = e.get(k);
}
}
return tmpMin;
};
public-double-MinX(ConcurrentMap e,HashSet h){
双tmpMin=1;
//int Xmin=0;
对于(int k=0;k
现在这给了我空指针异常```
在MinX()上,问题来自
公共双MinX(ConcurrentMap e,HashSet h){
双tmpMin=1;
对于(int k=0;k
e ConcurrentMap的最后一个元素为null。
因此,应将其替换为:
public double MinX(ConcurrentMap<Integer, Double> e, HashSet<Integer> h) {
double tmpMin = 1;
for (Integer k : e.keySet()) {
System.out.println("E inside fo"+e.get(k));
if (e.get(k) < tmpMin && !h.contains(e.get(k)))
{
tmpMin = e.get(k);
}
}System.out.println("min entropy is: " + tmpMin);
return tmpMin;}
公共双MinX(ConcurrentMap e,HashSet h){
双tmpMin=1;
for(整数k:e.keySet()){
System.out.println(“E-inside-fo”+E.get(k));
如果(e.get(k)
我看到while(E.size()…)
但我没有看到E
的任何声明-而且,在循环过程中修改集合(如Map)会导致未定义的行为。唯一安全的方法是使用迭代器,如youmap.keySet().Iterator()
,并通过迭代器删除,但由于您修改了映射,而不是仍然不确定的键集。您应该研究如何使用ConcurrentMap
查看一下。我编辑了代码并添加了E的声明方式,请注意,它不是空的,它包含的值与我在POST中显示的值相同。我尝试使用ConcurrentMap,但仍然相同发布NPEWaitaminute!你得到了一个NullPointerException
?你在问题中根本没有这么说——你只说了“检索第一分钟,然后停止”。查看回溯;NPE发生在哪一行?James的注释和链接仍然相关,还可以查看