java中向list中添加子list的另一种思路

本文介绍了一种改进的向列表中添加子列表的方法,通过定义接口和类来简化操作过程,使得添加单个元素或子列表更为简洁高效。

要向list中添加子list,最直观的思路就是list嵌套list。示例代码如下:

    @org.junit.Test
    public void testList(){
        List<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> subList1 = new ArrayList<Integer>();
        subList1.add(11);
        subList1.add(12);
        subList1.add(13);
        list.add(subList1);

        ArrayList<Integer> subList2 = new ArrayList<Integer>();
        subList2.add(21);
        subList2.add(22);
        subList2.add(23);
        list.add(subList2);

        for(Iterator<ArrayList<Integer>> itr = list.iterator(); itr.hasNext();){
            for(Iterator<Integer> itr2 = itr.next().iterator(); itr2.hasNext();) {
                System.out.println(itr2.next());
            }
        }
    }
----------------- 
输出:
11
12
13
21
22
23

这种方式的缺点有二。其一,如果只想增加一个元素,也不得不将其存入一个新list后再添加到原list中。其二,在遍历list元素的时候需要用两层循环迭代,代码冗长。总之,个人觉得代码写起来比较费事。

我最近看到了一种新的思路,分享给小伙伴们。

首先抽象出一个公共接口iMy,实际的元素类型My要实现该接口。然后将List<iMy>封装到一个类中,并让该类实现iMy接口。客户端持有一个泛型为iMy的list即可。

类图如下所示:

image

示例代码如下:


interface iMy{
    void print();
}

//list的元素的实际类型
class My implements iMy{
    public My(int i){this.i = i;}
    public int i;

    public void print() {
        System.out.println(i);
    }
}

//封装List<iMy>的类,要实现iMy接口
class My2 implements iMy{
    List<iMy> list = new ArrayList<iMy>();

    public void print() {
        for(Iterator<iMy> itr = list.iterator(); itr.hasNext();){
            itr.next().print();
        }
    }
}

测试代码:

    public static void main(String[] args) {
        List<iMy> list = new ArrayList<iMy>();
        list.add(new My(0));

        My2 my2 = new My2();
        my2.list.add(new My(1));
        my2.list.add(new My(2));
        my2.list.add(new My(3));
        list.add(my2);

        for(Iterator<iMy> itr = list.iterator(); itr.hasNext();){
            itr.next().print();
        }
    }
------------------------
输出:
0
1
2
3

从测试代码中可以看到,当只需要向list中添加一个元素时,直接添加即可,不需要特别为其创建一个新的list。并且,在遍历时,只有一层遍历,对子list的遍历由子list自己去做。个人觉得代码简洁了很多。

欢迎关注博主个人微信公众号~~~

Java 中,如果想把一个 `List` 的所有元素添加一个 `List` 中,可以使用 `addAll()` 方法。这是由 `List` 接口提供的功能,并且适用于所有的实现了该接口的类(例如 `ArrayList`, `LinkedList` 等)。 以下是详细的介绍及代码示例: ### 使用 addAll() 方法 `boolean addAll(Collection<? extends E> c)` 此方法的作用是将指定集合中的所有元素追加到当前列表中。操作完成后,原始列表会包含目标集合的所有元素。 #### 示例代码 ```java import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // 创建第一个 List 并填充数据 List<String> list1 = new ArrayList<>(); list1.add("Apple"); list1.add("Banana"); // 创建第二个 List 并填充数据 List<String> list2 = new ArrayList<>(); list2.add("Orange"); list2.add("Grapes"); // 将 list2 加入到 list1 中 list1.addAll(list2); // 输出合并后的结果 System.out.println(list1); // [Apple, Banana, Orange, Grapes] } } ``` 在这段代码里: 1. 我们先初始化了两个字符串类型的 `ArrayList` - `list1` 和 `list2`; 2. 随后调用 `list1.addAll(list2)` 方法,这使得 `list2` 所有的内容都被附加到了 `list1` 后面; 3. 最后打印输出验证确实已经成功加入了新的元素。 --- ### 其他方式 除了直接使用 `addAll()` 方法之外,还有其他几种实现同样效果的方式: 1. **循环插入** 可以通过遍历源列表并逐个向目标列表添加每个项目的方式来完成同样的任务。不过这种方式效率较低,尤其是对于大数据集来说不如内置函数优化得好。 ```java for (String item : list2){ list1.add(item); } ``` 2. **Stream API (Java 8及以上版本)** 利用流式操作也能达到目的,虽然它更常用于过滤、映射等情况,但在简单的情况下也完全可以胜任此项工作。 ```java list2.stream().forEach(list1::add); ``` 无论是采用哪一种途径都可根据实际需求和个人偏好选取最合适的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值