从ArrayList java中删除某个对象

从ArrayList java中删除某个对象,java,Java,我在Java上有一个ArrayList来存储工厂的几个订单。这些命令有几个atributes,其中包括idPedido。 问题是,如果我声明订单1、2和3,则通过名为bajaPedido的方法删除订单2,如下所示: public void bajaPedido(){ try{ idPedido=teclado.nextInt(); listaPedidos.remove(idPedido); }catch(

我在Java上有一个ArrayList来存储工厂的几个订单。这些命令有几个atributes,其中包括idPedido。 问题是,如果我声明订单1、2和3,则通过名为bajaPedido的方法删除订单2,如下所示:

public void bajaPedido(){
     try{
              idPedido=teclado.nextInt();
              listaPedidos.remove(idPedido); 
           }catch(InputMismatchException e){
               teclado.next();
              System.out.print("Debe utilizar números, por favor, repita el proceso");
           }catch(IndexOutOfBoundsException e){
               teclado.next();
               System.out.println("No existe un pedido con ese ID");
            }
    }
idPedido = teclado.nextInt();
for(Iterator<Order> itr = listaPedidos.iterator(); itr.hasNext();){
    Order order = itr.next();
    if(order.getId() == idPedido){
        itr.remove();
    }
}
然后,第三个顺序将位于数组的第二位,因为在这种情况下,idPedido指的是数组的位置,而不是对象中存储的变量

问题是,如果我输入id,它将向上搜索包含该id的对象并将其删除,而不是删除该id所对应的位置,那么如何对其进行编码呢?

使用迭代器,如下所示:

public void bajaPedido(){
     try{
              idPedido=teclado.nextInt();
              listaPedidos.remove(idPedido); 
           }catch(InputMismatchException e){
               teclado.next();
              System.out.print("Debe utilizar números, por favor, repita el proceso");
           }catch(IndexOutOfBoundsException e){
               teclado.next();
               System.out.println("No existe un pedido con ese ID");
            }
    }
idPedido = teclado.nextInt();
for(Iterator<Order> itr = listaPedidos.iterator(); itr.hasNext();){
    Order order = itr.next();
    if(order.getId() == idPedido){
        itr.remove();
    }
}
如果listaPedidos中所有订单的id都是唯一的,则使用break;在itr后移除;为了获得更好的性能,即即使在删除所需订单后也能防止循环运行

使用迭代器,如下所示:

public void bajaPedido(){
     try{
              idPedido=teclado.nextInt();
              listaPedidos.remove(idPedido); 
           }catch(InputMismatchException e){
               teclado.next();
              System.out.print("Debe utilizar números, por favor, repita el proceso");
           }catch(IndexOutOfBoundsException e){
               teclado.next();
               System.out.println("No existe un pedido con ese ID");
            }
    }
idPedido = teclado.nextInt();
for(Iterator<Order> itr = listaPedidos.iterator(); itr.hasNext();){
    Order order = itr.next();
    if(order.getId() == idPedido){
        itr.remove();
    }
}

如果listaPedidos中所有订单的id都是唯一的,则使用break;在itr后移除;为了获得更好的性能,即即使在删除所需订单后也能防止循环运行

我认为最简单的方法是使用地图而不是列表,其中的键应该是idPedido并为pedido对象赋值

Map<Integer, Pedido> map = new HashMap<>();
map.put(idPedido, Pedido);
map.remove(idPedido);
在这种情况下,您必须在Pedido类上实现equals方法


我认为最简单的方法是使用地图而不是列表,其中的关键应该是您的idPedido并为pedido对象赋值

Map<Integer, Pedido> map = new HashMap<>();
map.put(idPedido, Pedido);
map.remove(idPedido);
在这种情况下,您必须在Pedido类上实现equals方法


您可以通过使用流api来解决这个问题

List<Orders> orders= contain orders object
orders.stream().filter(item -> item.getIdPedido().equals("Your Id")).findFirst()
            .map(p -> {
                orders.remove(p);
                return p;
            }).get();

我希望它能起作用。

您可以通过使用流api解决这个问题

List<Orders> orders= contain orders object
orders.stream().filter(item -> item.getIdPedido().equals("Your Id")).findFirst()
            .map(p -> {
                orders.remove(p);
                return p;
            }).get();

我希望它能起作用。

哦,我明白了,现在我明白了地图是如何使用的,它比使用列表更有意义。我可能会使用你提出的第二种方法,因为我缺乏使用地图的经验,而且我的日程安排很紧。非常感谢,伙计!哦,我明白了,现在我明白了地图是如何使用的,这比使用列表更有意义。我可能会使用你提出的第二种方法,因为我缺乏使用地图的经验,而且我的日程安排很紧。非常感谢,伙计!这也是一种有趣的方法,多亏了你和Jordi,现在我对如何使用阵列有了更好的了解。谢谢!不客气。这是从列表中删除项目的推荐方法。刚刚尝试过,它确实有效,现在我可以用它重新编写一些方法。说真的,非常感谢!这也是一种有趣的方法,多亏了你和Jordi,现在我对如何使用阵列有了更好的了解。谢谢!不客气。这是从列表中删除项目的推荐方法。刚刚尝试过,它确实有效,现在我可以用它重新编写一些方法。说真的,非常感谢!我正在使用Arvind建议的,但是,尽管如此,非常感谢您的回复和对stream api的后见之明,这也是一个很好的工具!我正在使用Arvind建议的,但是,尽管如此,非常感谢您的回复和对stream api的后见之明,这也是一个很好的工具!