【问题标题】:Java new values return after remove删除后返回 Java 新值
【发布时间】:2021-09-21 23:25:22
【问题描述】:

关于代码的一点解释:ntTPla.values() 包含计划,并且在一些计划中可以有包(孩子的)。有代码,将包添加到计划“ntTPla.addPackage”。在此代码之后(当所有包都将添加到计划中时)我应该检查包并删除错误的包。我编写了代码,它检查包是否良好并删除错误的。问题 - 如何退回附近的所有计划和新套餐?因为现在代码返回旧的。我调试和删除工作正常,只需要修复返回。我的代码应该是什么样子?

[...]
        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();

【问题讨论】:

  • 请不要破坏您自己的帖子。当您在此处发帖时,您授予 SO 根据 CC-by SA 4.0 分发内容的权利。任何破坏行为都将被撤销。

标签: java arrays return


【解决方案1】:

从您的描述看来,问题在于return ntTPla.values(); 语句返回的值仍然包含已删除的数据包。您从 packetFirst 中删除了该项目,但没有从 ntPla.values() 中删除。你只需要做类似的事情

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

编辑

在评论区讨论了这个问题之后,也许我对这个问题的理解比以前更好了。这是我建议的解决方案:

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);
}

可能我还是不明白这个问题。如果是这样,请见谅。

【讨论】:

  • 我尝试使用此代码并收到警告消息:“Collection 上的 remove(Object) 的参数类型不太可能为 int”。 ntTPla.values() - 在其中包含计划、包。我们需要移除更深处的 Packages。
  • @yYy 然后你可以迭代你的values 并从包中删除需要删除的内容。
  • 也许你能告诉我它的样子?我是新手,所以很难搞定。
  • @yYy 你能分享你的课程代码吗? tPlan.get(0).getPacket() 是一个很大的线索,但我想了解更多关于你的数据结构的信息。
  • 这个类的代码行很多,不知道贴在这里好不好。但是该代码中的 Packet 并没有什么特别之处。 tPlan.get(0).getPacket() 我会试着解释一下。 ntTPla.values() 包含计划和包(计划的子项)。我创建了tPlan,其中包含 3 个计划(0,1,2 索引)和packetFirst,其中包含第一个计划的所有包(0 索引)。因此,使用此代码,我尝试获取第一个计划的所有包。后来我检查了所有包并将它们从列表中删除。从 List 中删除工作正常,只需要弄清楚如何返回 Collection。
【解决方案2】:
//return ntTPla.values();

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

用上面的替换最后一行。您创建了tPlan,以便您可以安全地修改计划的副本,而与ntTPla.values() 中的原始计划列表无关。您需要用新处理的packetFirst 替换tPlan 的计划0。然后返回tPlan

更新: 我之前的代码是错误的。

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

tPlanjava.util.List 类型吗? .set(...)

更新 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...
}

【讨论】:

  • 在我的情况下 tPlan 没有 .set()。当我尝试写“tPlan”时。 , .set won 出现。
  • tPlanjava.util.List 一切都很好,对不起。它有.set。我应该把final Plan newPlan = new Plan(); 放在哪里? setPackage 是什么?
  • setPackage 应该是 setPacket。对不起这个错误。我已经更新了上面的解决方案。
  • 感谢您尝试帮助我。我更新了我的第一篇文章(添加了一些代码)。我没有public class Plan。你能再检查一次我的代码吗?
  • 也许将我的remove 代码更改为例如filter 会更好?也许只需要通过另一种方式来实现这一点?但我不知道该怎么做..
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多