集合(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

浙公网安备 33010602011771号