我有一个列表地图,其中key = GROUP和value =列表编号存储为字符串。 一个元素在
之下GROUP1/[3.0, 4.0, 2.0, 3.0, 3.0, 2.0, 2.0, 2.0, 2.0, -2.0, -2.0, -2.0, 2.0]
我要做的是取消(删除)所有负数而不是正数,但将+ ve数减去该值。
在上面的示例中,3将取消-2(第一个-ve),留下+1作为临时总数
然后+1(来自上游的总数)将取消-2(下一个-ve),留下-1作为临时总数
-1必须与4对齐(列表中的下一个+ ve),留下3作为临时总数
然后,3个方格对-2(下一个-ve)离开,总共留下1个。
因此,所有-ve都从List中删除,因此是3.0,4.0,但第一个元素现在是1.0(1.0是最后一个临时总数)
最终序列
[1.0, 2.0, 3.0, 3.0, 2.0, 2.0, 2.0, 2.0, 2.0]
到目前为止,我的代码总计如下所示。
Map<String, List<String>> m = new HashMap<String, List<String>>();
...
for (Entry<String, List<String>> entry : m.entrySet())
{
System.out.println(entry.getKey() + "/" + entry.getValue());
double calc = 0;
for (String element:entry.getValue()){
//System.out.println(element);
calc = calc + new Double(element).doubleValue();
}
//if (calc > 0.0)
System.out.println("Total for Item: " + entry.getKey() + " is "+calc);
}
项目总计:GROUP1为19.0
我知道我们不应该在迭代时从List中删除元素,所以问题是
A)理想逻辑,用于删除上述序列中的数字。
B)我应该构建一个新的List并在迭代时向其中添加元素吗?
C)我应该将我从列表地图存储的集合更改为某些类结构吗?
答案 0 :(得分:2)
我认为最简单的解决方案是迭代列表两次,在第一次迭代时拉出负数,然后在第二次迭代时调整剩余数字。如果没有必要保留原始地图状态,那么我会做一切就绪,虽然我不确定为什么你认为你在迭代时改变地图,因为你的代码中没有任何东西这样做(除非那样)是一个拼写错误,你的意思是列表)。
至于集合类型,我认为主要问题是各种操作需要什么类型的性能,而不是数据的大小/类型。下面是我在上面描述的算法的实现。由于这可能会有很多删除(取决于您的数据),如果列表是LinkedLists可能会更好,因为它们可以在恒定时间内删除。当然,如果您需要更好的索引访问性能,您可以随时使用LinkedLists进行这些计算,然后将数据副本作为另一种类型(如ArrayList)复制。
正如我之前所说,这是一个使用两遍方法的实现。注意我不删除零值,并且如果总数为负数,则最后会插入一个负值(不确定在这种情况下你的要求是什么):
for (Entry<String, List<String>> entry : m.entrySet()){
System.out.println(entry.getKey() + "/" + entry.getValue());
double calc=0,acc = 0, item;
//First look for negative values
for (Iterator<String> it=entry.getValue().iterator();it.hasNext();){
item = Double.parseDouble(it.next());
calc += item;
if(item < 0){
//accumulate them, and remove them from the list
acc += item;
it.remove();
}
}
if(calc > 0){
//now adjust the remaining positive numbers
for (Iterator<String> it=entry.getValue().iterator();it.hasNext();){
item = Double.parseDouble(it.next());
//remove the number as we adjust it if it
//is the last positive it will be reinserted
//when the loop breaks
it.remove();
if((acc+=item) >= 0){
//the accumulated numbers are now positive
break;
}
}
//re-insert the adjusted positive back into the list
entry.getValue().add(0, Double.toString(acc));
}else{
//the total sum was negative or zero
entry.getValue().clear();
entry.getValue().add(Double.toString(calc));
}
System.out.println("Total for Item: " + entry.getKey() + " is "+calc);
System.out.println("List is now: "+entry.getValue());
}