集合(7):List集合练习1

集合(7):List集合练习

一、ArrayList的练习

1、去除集合中字符串的重复值
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListTest {
    public static void main(String[] args) {
        //创建旧的集合对象
        ArrayList list1 = new ArrayList();
        //向集合中添加元素
        list1.add("李玉伟");
        list1.add("李嘉诚");
        list1.add("马化腾");
        list1.add("刘强东");
        list1.add("李玉伟");
        list1.add("王健林");
        list1.add("马云");
        list1.add("雷军");
        System.out.println("旧集合为:"+list1);
        //[李玉伟, 李嘉诚, 马化腾, 刘强东, 李玉伟, 王健林, 马云, 雷军]

        //创建新的集合对象
        ArrayList list2 = new ArrayList();
        //遍历旧集合的元素
        //调用迭代器再遍历
        Iterator iterator1 = list1.iterator();
        while(iterator1.hasNext()){
            Object next1 = iterator1.next();
            String s = (String)next1;

            //拿着遍历出来的元素去新集合里面去找
            //如果找到,说明重复;如果没找到,就添加到新集合中
            if(!list2.contains(s)){
                list2.add(s);
            }
        }
        System.out.println("新集合为:"+list2);
    }
}

执行结果如下:

旧集合为:[李玉伟, 李嘉诚, 马化腾, 刘强东, 李玉伟, 王健林, 马云, 雷军]
新集合为:[李玉伟, 李嘉诚, 马化腾, 刘强东, 王健林, 马云, 雷军]

Process finished with exit code 0
2、去除集合中自定义对象的重复值(对象的成员变量值都相同)
import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListTest2 {
    public static void main(String[] args) {
        //创建旧集合对象
        ArrayList list1 = new ArrayList();
        //自定义集合对象
        Student s1 = new Student("李玉伟", 18);
        Student s2 = new Student("李嘉诚", 68);
        Student s3 = new Student("李玉伟", 18);
        Student s4 = new Student("王健林", 67);
        //向集合中添加对象信息
        list1.add(s1);
        list1.add(s2);
        list1.add(s3);
        list1.add(s4);
        System.out.println(list1);

        //创建新集合对象
        ArrayList list2 = new ArrayList();

        //调用迭代器遍历旧集合的元素
        Iterator iterator = list1.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            Student s = (Student)next;

            if(!list2.contains(s)){
            list2.add(s);
            }
        }
        System.out.println(list2);
    }
}

执行结果如下:

[Student{name='李玉伟', age=18}, Student{name='李嘉诚', age=68}, Student{name='李玉伟', age=18}, Student{name='王健林', age=67}]
[Student{name='李玉伟', age=18}, Student{name='李嘉诚', age=68}, Student{name='王健林', age=67}]

Process finished with exit code 0
/*
我们按照处理字符串的形式处理重复的自定义对象,发现结果并没有去重,这是为什么呢?

要想知道为什么,就得知道问题处在了哪一行代码。经过简单的分析后,我们发现问题出现了在判断的时候出现了。
因为只有当if里面是true的时候,才添加到新集合中,说明我们的代码一直都是true,
换句话说,contains()方法并没有生效。

怎么改呢?要想知道怎么改,看一看contains内部是怎么实现的。

底层调用的是元素的equals方法,又因为我们Student类没有重写equals方法,
调用的是父类Object类中的equals方法,比较的是地址值,所以contains()结果永远是true,
if判断永远判断的是新集合不包含,就添加到新集合中,所以产生了没有去重的效果。

解决办法:元素类重写equals()方法
*/

二、LinkedList类的练习

用LinkedList模拟栈数据结构的集合,并测试
错误演示:
public class LinkedListTest1 {
    public static void main(String[] args) {
        //创建集合
        LinkedList linkedList = new LinkedList();
        /*
            因为需求是模拟栈的数据结构:先进后出
            所以此处不能使用add()添加
            linkedList.add("hello");
            linkedList.add("world");
            linkedList.add("java");
            System.out.println(linkedList);//[hello,world,java]
         */
        //使用addFirst()方法
        linkedList.addFirst("hello");
        linkedList.addFirst("world");
        linkedList.addFirst("java");
        System.out.println(linkedList);//[java, world, hello]

        //遍历
        Iterator iterator = linkedList.iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
	//因为LinkedList属于集合的最底层,不需要向下转型
            System.out.println(next);
        }

        //如果面试的时候,你按照上面的写法 0分
    }
}
            执行结果如下:
                        [java, world, hello]
                        java
                        world
                        hello

                        Process finished with exit code 0

题目的真正意思是,自己写一个类,底层是LinkedList,调用自己写的方法实现栈数据结构

创建一个自己的类
import java.util.LinkedList;

//创建一个自己的类
public class MyStack {
    //定义LinkedList类型的成员变量
    private LinkedList ld;

    //构造方法
    MyStack(){
        ld = new LinkedList();
    }

    //创建一个自己的添加方法,参数类型不确定,此时用Object
    public void myAdd(Object o){
        ld.addFirst(o);//成员变量调用方法
    }

    //创建一个自己的获取方法,返回值类型为Object类型
    public Object myGet(){
        return ld.removeFirst();
    }

    //获取之后,判断下个位置是否还有元素
    public boolean myIsEmpty(){
        return ld.isEmpty();
    }
}
public class MyStackTest {
    public static void main(String[] args) {
        //创建自己定义的集合类对象
        MyStack myStack = new MyStack();

        //添加元素
        myStack.myAdd("hello");
        myStack.myAdd("world");
        myStack.myAdd("java");
        myStack.myAdd("bigdata");

	//循环遍历
        while (!myStack.myIsEmpty()){
            Object o = myStack.myGet();
            String s = (String) o;
            System.out.println(s);
        }
    }
}

执行结果如下:

bigdata
java
world
hello

Process finished with exit code 0
posted @ 2021-12-28 16:27  阿伟宝座  阅读(70)  评论(0)    收藏  举报