java 将元素从一个数组列表移动到另一个数组列表

gev0vcfq  于 2023-01-11  发布在  Java
关注(0)|答案(7)|浏览(171)

我有个问题
我有两份名单

List<SellableItems> table1 = new ArrayList();
List<SellableItems> table2 = new Arraylist();

在我的可出售物品类中,我有一个名称和价格。
现在,我希望将元素从table1移动到table2。因此,如果我的列表中包含价格为20的啤酒,我可以将其从table1移动到table2

mqxuamgl

mqxuamgl1#

遍历源列表,如果某个项目与您的条件匹配,则将其从源列表中移除并添加到目标列表中:

for(int i=0; i<table1.size(); i++) {
    if(table1.get(i).price==20) {
        table2.add(table1.remove(i));
    }
}

或者使用foreach循环:

for(SellableItem item : table1) {
    if(item.price==20) {
        table1.remove(item);
        table2.add(item);
    }
}
qzwqbdag

qzwqbdag2#

如果要移动特定项目:

moveSellableItem(List<SellableItem> source, SellableItem item, List<SellableItem> destination){
    destination.add(item);
    source.remove(item);
}

如果要移动具有特定参数(示例中的价格)的所有物料:

moveSellableItemWithPrice(List<SellableItem> source, double price, List<SellableItem> destination)
{
    var itemsToMove = new ArrayList<SellableItem>();
    for(SellableItem item : source){
        if(item.price == price) {
            itemsToMove.add(item);
        }
    }
    source.removeAll(itemsToMove);
    destination.addAll(itemsToMove);
}

此外,您可以使用lambda来代替foreach循环:
从Java 8:var itemsToMove = source.stream().filter(i -> i.price == price).collect(Collectors.toList());
从Java 16:var itemsToMove = source.stream().filter(i -> i.price == price).toList();

du7egjpx

du7egjpx3#

import java.util.List;
        import java.util.ArrayList;
        public class Details
        {
            public static void main(String [] args)
            {
                //First ArrayList
       List<SellableItems> arraylist1=new ArrayList<SellableItems>();
                arraylist1.add(SellableItems);

                //Second ArrayList
          List<SellableItems> arraylist2=new ArrayList<SellableItems>();
                arraylist2.add(SellableItems);

    arraylist1.addAll(arraylist2);

                }
            }

这可以完成,请参阅此示例

您可以参考begginers一书中的收集框架

mkshixfv

mkshixfv4#

迭代第一个列表,并在价格等于20时添加到第二个列表:

List<SellableItems> table1 = new ArrayList<>();
List<SellableItems> table2 = new ArrayList<>();

Iterator<SellableItems> itemsIterator = table1.iterator();
while (itemsIterator.hasNext()) {
    SellableItems next = itemsIterator.next();
    if (next.price.equals(20)) {
        table2.add(next);
        itemsIterator.remove();
    }
}
7vhp5slm

7vhp5slm5#

也许可以使用stream将所有值相加,其中name = beerprice = 20

table1.stream().filter((table11) -> (table11.getName().equals("beer") && table11.getPrice() == 20)).forEach((table11) -> {
            table2.add(table11);
        });

然后从原始列表中删除所有内容(如果需要)

table1.removeAll(table2);
p5cysglq

p5cysglq6#

我假设您想要 filter 第一个列表,并将结果存储到另一个列表中,这样您就拥有了同一个列表的原始版本和修改后的版本。
因为我不知道SellableItem类是如何构造的,所以我在示例中使用了一些整数:

// List of random Integers for the example
List<Integer> li = new Random().ints( 100,0,30 ).boxed().collect( Collectors.toList() );
// The list which will contain the results
List<Integer> target;

// A stream (since Java 8) which is filtering for a certain Predicate and
// collecting the result as a list.
target = li.stream().filter( i->i.intValue() > 20 ).collect( Collectors.toList() );

System.out.println( target );

在这种情况下,target将仅包含适用于其值大于20的项。
但是,如果您不想保留原始列表并删除存储在第二个列表中的项目,您可以调用li.removeAll(target);

jvidinwx

jvidinwx7#

以下是两个附加选项:

Iterator<SellableItem> iter = table1.iterator();
while (iter.hasNext()) {
    SellableItem item = iter.next();
    if (item.getName().equals("beer") && item.getPrice() == 20) {
        iter.remove();
        table2.add(item);
    }
}

以及

Predicate<SellableItem> test = item -> item.getName().equals("beer") && item.getPrice() == 20;
table1.stream().filter(test).forEach(table2::add);
table1.removeIf(test);

相关问题