Java new values return after remove

Viewed 152

A little bit explanation about code: ntTPla.values() contains Plans and inside some Plans can have Packages ( child's ). There are code, which adding Packages to Plans "ntTPla.addPackage". After this code ( when all packages will be added to Plans ) I should check Packages and delete wrong Packages. I wrote code, which checking if Packages is good and remove wrong ones. Question - how to return all Plans and new Packages near them? Because now code returning old ones. I debugged and removing working fine, just need to fix return. How my code should look like?

[...]
        List<Plan> tPlan = new ArrayList<Plan>();
        tPlan.addAll(ntTPla.values());
        
        List<Packet> packetFirst = new ArrayList<Packet>();
        packetFirst.addAll(tPlan.get(0).getPacket());
        
        String test2 = null;
            for (int i = 0 ; i < packetFirst.size(); i++){ 
                if(packetFirst.get(i).getBest()) {
                    test2 = packetFirst.get(i).getCode();
                    break;
                }
            }
            
            for (int ii =  packetFirst.size() - 1 ; ii >= 0; ii--){ 
                if(!packetFirst.get(ii).getCode().equals(test2)) {
                    packetFirst.remove(ii);
                }
            }
        
        return ntTPla.values();
2 Answers

From what you describe it seems that the problem is that the value returned by the statement of return ntTPla.values(); still contains packets that were removed. You remove the item from packetFirst, but not from ntPla.values(). You will just need to do something like

for (int ii =  packetFirst.size() - 1 ; ii >= 0; ii--){ 
    if(!packetFirst.get(ii).getCode().equals(test2)) {
        packetFirst.remove(ii);
        ntPla.values().remove(ii);
    }
}

EDIT

After discussing the problem in the comment section, maybe I have a better understanding about the problem than previously. This is my suggested solution:

for (int planIndex = 0; planIndex < tPlan.size(); planIndex++) {
    Plan plan = tPlan.get(planIndex);
    int bestIndex = 0;
    for (int packetIndex = 0; packetIndex < plan.getPacket().size(); packetIndex++) {
        Packet packet = plan.getPacket().get(packetIndex);
        if (packet.getBest()) bestIndex = packetIndex;
    }
    if (bestIndex >= 0) plan.getPacket.remove(bestIndex);
}

It's possible that I still do not understand the problem. If that's the case, then please excuse me.

//return ntTPla.values();

tPlan.set(0, packetFirst);
return tPlan;

Replace last line with above. You created tPlan so that you can safely modify a copy of plans independent of the original list of plans in ntTPla.values(). You need to replace plan 0 of tPlan with your newly processed packetFirst. Then return tPlan.

Update: My earlier code was wrong.

final Plan newPlan = new Plan();
// newPlan.setPackage(packetFirst);
// Used a wrong setter name earlier.
newPlan.setPacket(packetFirst);
tPlan.set(0, newPlan);
return tPlan;

Is tPlan of type java.util.List? .set(...)

Update 2:

for (int ii =  packetFirst.size() - 1 ; ii >= 0; ii--){ 
    if(!packetFirst.get(ii).getCode().equals(test2)) {
        packetFirst.remove(ii);
    }
}
// After your code above...

final Plan newPlan = new Plan();
//...

// I am guessing you have a class like this...
public class Plan {
    private List<Packet> packet;

    public void setPacket(List<Packet> packet) {
        this.packet = packet;
    }
    // getter here...
}
Related