双循环与arraylist正在改变大小

时间:2014-01-24 15:03:16

标签: java debugging for-loop arraylist

情况是我有两个嵌套的for循环,每个循环遍历一个对象的arraylist。外部for循环在当前索引处抓取对象,并将另外两个名为tempCurrEmp的arraylist添加到其中。然后,内部for循环将通过并删除原始arraylist中在特定字段处相同的所有对象。问题是它没有删除所有副本,我不知道为什么。我假设它与我在调用删除后更改的索引有关,但我可以肯定。非常感谢任何建议。

for(int i=0;i<tempAllEmp.size();i++){
                tempCurrEmp.add(tempAllEmp.get(i));
                tempEmp = tempAllEmp.get(i);
                Log.d("LOOP", "Curr emp is: " + tempAllEmp.get(i).getEmployee());
                for(int j=i+1;j<tempAllEmp.size();j++){
                    Log.d("LOOP", "Comparing:" + tempEmp.getEmployee() + " and " + tempAllEmp.get(j).getEmployee().trim());
                    if(tempAllEmp.get(j).getEmployee().trim().equals(tempEmp.getEmployee())){
                        Log.d("LOOP", "They were equal");
                        tempCurrEmp.add(tempAllEmp.get(j));
                        tempAllEmp.remove(j);

                    }
                }
                maxPunch.add(getMaxPunch(tempCurrEmp));
                tempCurrEmp.clear();                    
            }

4 个答案:

答案 0 :(得分:2)

  

ArrayList public E remove(int index)   删除指定的元素   在此列表中的位置。将任何后续元素向左移动   (从他们的指数中减去一个)。

所以你必须在删除后将1减去你的j

tempAllEmp.remove(j--);

并修正比较:

if(tempAllEmp.get(j).getEmployee().equals(tempEmp.getEmployee())){

答案 1 :(得分:0)

tempEmp.getEmployee() 比较时,您是否忘记修剪 tempAllEmp.get(j).getEmployee().trim()

答案 2 :(得分:0)

总而言之,你刚拿了一个清单并把它放到另一个清单上,因为:

//找到2个相同的雇员

tempCurrEmp.add(tempAllEmp.get(i));
tempEmp = tempAllEmp.get(i);

//然后你试着弄清楚你刚刚从temAllEmp找到的Employ是否真的存在于tempAllEmp中

for(int j=i+1;j<tempAllEmp.size();j++){
if(tempAllEmp.get(j).getEmployee().trim().equals(tempEmp.getEmployee())){                        tempCurrEmp.add(tempAllEmp.get(j));
tempAllEmp.remove(j);
}

//如果你找到一个,那么你首先将他添加到当前的雇员名单,然后你从最后的所有雇员名单中删除他,我被告知这不会以异常结束

tempCurrEmp.add(tempAllEmp.get(j));
tempAllEmp.remove(j);

=============================================== =====

试试这个:

List<Employee> currentEmployees = new ArrayList<Employee>();
for(int i=0 ; i <= tempAllEmp.size() ; i++ ){
    if(! currentEmployess.contains(templAllEmp.get(i))){
        currentEmployees.add(templAllEmp.get(i));
    }
}

在Employee类中加上你的equals()方法:

public boolean equals(Object obj) {
    if (obj == this) {
        return true;
    }
    if (!(obj instanceof Employee)) {
        return false;
    }
    Employee other = (Employee) obj;
    return this.employeeId.equals(other.employeeId);
}

答案 3 :(得分:0)

您绝对应该更改算法并使用Set。见下面的例子:

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

public class Program {

    public static void main(String args[]) throws IOException {
        List<Node> nodes = new ArrayList<>();
        // generate data
        Random random = new Random();
        while (nodes.size() < 100) {
            Node node = new Node();
            node.employee = String.valueOf(random.nextInt(10) + 1);

            nodes.add(node);
        }
        System.out.println(nodes);

        // remove duplicates
        List<Node> newNodes = getUiniqueCollection(nodes);
        System.out.println(newNodes);
    }

    private static List<Node> getUiniqueCollection(List<Node> nodes) {
        List<Node> resultNodes = new ArrayList<>();
        Set<String> employees = new HashSet<>();
        for (Node node : nodes) {
            String employee = node.employee.trim();
            if (!employees.contains(employee)) {
                employees.add(employee);
                resultNodes.add(node);
            }
        }

        return resultNodes;
    }
}

class Node {

    String employee;

    @Override
    public String toString() {
        return employee;
    }
}