我有一些问题试图这样做,我仍然不明白为什么这段代码没有做任何事情......它从我的列表中删除任何内容,只是循环。一些提示?
public void compute(){
String formula ="";
boolean hasDependencies = false;
Integer value = 0;
while(!cellsNotComputed.isEmpty()){
for(int i=0; i<cellsNotComputed.size(); i++){
formula = getCell(cellsNotComputed.get(i).getRow(),
cellsNotComputed.get(i).getColumn())
.getContent();
// formulas always begin with = and only contains cell names
// and + symbols (ex. =A1+A2+A3)
formula = formula.substring(1);
String[] dependantCells = formula.split("\\+");
for (String cellName : dependantCells) {
for (Cell cell : cellsNotComputed) {
if(cell.getName().equals(cellName)){
hasDependencies = true;
}
}
if(!hasDependencies){
value = value + getCell(cellName).getValue();
}
}
if(!hasDependencies){
Cell computedCell = cellsNotComputed.get(i);
cellsNotComputed.remove(i); // it works but... **
i--;
computedCell.setValue(value);
setCell(computedCell.getRow(),
computedCell.getColumn(),
computedCell);
}
hasDependencies = false; //** here the element removed is again
// in the list.
value = 0;
}
}
}
**只是为了澄清,cellsNotComputed是一个属性并且是一个ArrayList,它包含包含公式的表的所有单元格,因此在检查依赖关系之前无法计算它们。
答案 0 :(得分:2)
我在你的代码中无法理解的是,如果你没有找到任何匹配项,或者你发现任何内容不是什么的单元格,这个循环将是一个无限循环。
考虑我尝试进行测试的以下代码段。
public class Test {
static class Cell{
private int id;
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Cell(int id, String content) {
this.id = id;
this.content = content;
}
@Override
public String toString() {
return "Cell [id=" + id + ", content=" + content + "]";
}
}
static private List<Cell> cellsNotComputed;
public static void main(String[] args){
cellsNotComputed = new ArrayList<Test.Cell>();
cellsNotComputed.add(new Cell(1, "Something"));
//cellsNotComputed.add(new Cell(2, "Hi"));
System.out.println("Before removing " + cellsNotComputed);
while(!cellsNotComputed.isEmpty()){
for(int i=0; i<cellsNotComputed.size(); i++){
if(cellsNotComputed.get(i).getContent().equals("Something")){
System.out.println(cellsNotComputed.remove(i));
i--;
}
}
}
System.out.println("After removing " + cellsNotComputed);
}
只有当arrayList中只有一个单元格且内容与“Something”完全相同时,才会有效。请查看内容。
我不确定这是否是您想要的,因为如果出现以下情况,它会进入无限循环: 该列表包含内容不是“Something”的任何单元格
以上代码生成
Before removing [Cell [id=1, content=Something]]
Cell [id=1, content=Something]
After removing []
并终止
答案 1 :(得分:2)
如果您想清空列表,请致电
cellsNotComputed.clear ();
答案 2 :(得分:1)
你的for循环每一步都会增加i
,但在你的循环内你只需减少它...就像i + 1 - 1 = i
一样。
答案 3 :(得分:1)
如前所述,您的样本只是增加和减少计数器,这是一种奇怪的模式。
尝试更像这样的东西:
public void remove(){
while(!this.cellsNotComputed.isEmpty()) {
//if you need to do something with the element, extract 0 and do it.
cellsNotComputed.remove(0);
}
}
或者更好,如果您只想清除:
public void remove(){
cellsNotComputed.clear();
}
答案 4 :(得分:0)
如果要删除列表中的所有元素,可以使用clear方法。
cellsNotComputed.clear ();
Clear()从ist中删除所有元素。此调用返回后列表将为空。
答案 5 :(得分:0)
public void remove(){
List<Integer> founds= new ArrayList<Integer>;
while(!this.cellsNotComputed.isEmpty()){
for(int i=0; i<this.cellsNotComputed.size(); i++){
if(cellsNotComputed.get(i).getContent().equals("something")){
// cellsNotComputed.remove(i);
founds.add(i);
//i--;
}
}
}
for(int f: founds){
cellsNotComputed.remove(f);
}
}