Java泛型、集合框架List接口、迭代器Iterator和Collections工具类的综合实战训练

 

一、知识点回顾

1、Java泛型<>

概念:

泛型用来方便明确当前想要使用的数据类型是什么,使用尖括号<> 表示,数据类型必须是类这种类型。

如:创建了一个Worker类,把该类作为泛型来使用,<Student>。

注意:

  • 数据类型不可以是int、double等原生数据类型。
  • 可以是原生数据类型的类:Integer、String等。

2、集合框架List接口

概念:

泛型接口List<> ,实现该泛型接口的泛型类有:LinkedList<>、ArrayList<>。

原理:

使用了接口回调技术,因为LinkedList<>泛型类中的大部分方法都是对泛型接口List<>中的方法的实现。因此把LinkedList<>对象的引用赋值给List<>接口变量,接口就可以调用LinkedList<>类实现的接口方法了。

代码使用:

List<Student>  list=new LinkedList<Student>()

常用类方法:

  • 添加对象:list.add(new Worker("","",""))
  • 删除对象:list.remove(index)
  • 统计对象:list.size()
  • 获取对象:list.get(index)

3、Collections工具类

概念:

Collections工具类提供了很多类方法,这些类方法可以对集合进行排序、查找、随机排序、旋转等类方法。

常用类方法:

  • 升序排序:Collections.sort(list)
  • 随机排序:Collections.shuffle(list)
  • 旋转排序:Collections.reverse(list)
  • 降序排序:先使用sort()升序,接着使用reverse()旋转就能够到达降序的目的

当对象中包含多个属性时如何对其中一个属性进行排序???

例题:创建的工人worker对象中有三个属性:姓名、年龄、工资。那么如何对该对象中的工资进行排序呢?

思考:首先想到的肯定是先把所有工人的工资提取出来单独放入一个容器中(可以新建一个List接口的链表LinkedList来存放取出的数据),再使用Collections工具类进行排序。

问题:如何才能把每一个工人对象中的工资属性提取出来呢?

方案一:List<Integer> Salarylist =list.stream(). map(Worker ->Worker.getSalary()).collect (Collectors.toList()); 

现在所有工资已经存放在 Salarylis 中,只需要对 Salarylist 进行Collections排序就可以了。


4、迭代器Iterator遍历

创建Iterator迭代器对象的方法:

需要使用接口List的接口对象list来调用类方法list.iterator() 并赋值给Iterator创建的 iter 对象。

遍历原理:

Iterator创建的迭代器对象相当于一个指针,指向创建的LinkedList链表的第一个结点,获取到第一个对象结点后,迭代器会自动获取下一个结点的对象数据,所以迭代器可以快速的遍历集合。

代码使用:

Iterator<Worker>  iter=list.iterator()

常用类方法:

  • 判空对象:iter.hasNext()
  • 获取对象:iter.next()

遍历代码:

while( iter.hasNext() ){

Worker  worker = iter.next();

System.out.println(worker.name + worker.salary);

}


 

二、实战案例

要求:

1、创建一个Worker类,成员变量有:姓名、年龄、工资,成员方法。

2、创建一个List接口对象,并使用LinkedList赋值给list接口。

3、使用类方法 list.add() 添加工人信息。

4、使用Iterator迭代器遍历,显示工人信息。

5、使用类方法 list.remove() 删除工人娃哈哈的信息。

6、使用Collections工具类里面的类方法对工人的工资进行降序排序,输出排序后的个人信息。

工人类Worker

public class Worker {

    public String Name;
    public int Age;
    public int Salary;

    public Worker(String Name, int Age, int Salary) {
        this.Name = Name;
        this.Age = Age;
        this.Salary = Salary;
    }

    public int getSalary() {
        return Salary;
    }

}

测试类WorkerTest

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class WorkerTest {

    public static void main(String[] args) {
        //1、集合框架泛型接口List创建接口变量list,链表LinkedList类实现接口里面的方法并赋值给接口变量list使用
        List<Worker> list = new LinkedList<Worker>();
        
        //2、使用类方法add()添加对象
        list.add(new Worker("张一", 33, 5500));
        list.add(new Worker("张二", 37, 6500));
        list.add(new Worker("张三", 31, 4500));
        list.add(new Worker("张四", 39, 7000));
        list.add(new Worker("张五", 36, 6300));
        
        //3、创建迭代器Iterator对象iter遍历,用接口变量list的类方法iterator()创建并赋值
        Iterator<Worker> iter = list.iterator();
        while (iter.hasNext()) {
            Worker worker = iter.next();
            System.out.print(worker.Name + worker.Age + " " + worker.Salary + "    ");
        }
        System.out.println("");
        
        //4、使用类方法remove()删除指定下标的对象
        list.remove(2);
        iter = list.iterator();
        while (iter.hasNext()) {
            Worker worker = iter.next();
            System.out.print(worker.Name + worker.Age + " " + worker.Salary + "    ");
        }
        System.out.println("");
        
        /*5、使用Collections工具类对链表中的元素进行排序操作
        要求:对工资降序排序
        问题:(1)、Collections工具类中没有降序类方法  
              (2)、该工人worker对象中有三个属性,需先提取所有工人工资出来再排序
        方案:(1)、使用两种Collections工具类中的类方法:sort()升序、reverse()旋转
              (2)、使用list.stream().map(Worker -> Worker.getSalary()).collect(Collectors.toList())提取对象中的工资
                   再新建一个List<Integer>容器用来存放所有工资
                   map作用:将原数据转换为指定的数据
        */
        //获取工资数据存放新建Salarylist接口变量中
        List<Integer> Salarylist = list.stream().map(Worker -> Worker.getSalary()).collect(Collectors.toList());
        //升序排序
        Collections.sort(Salarylist);
        Iterator<Integer> Salaryiter = Salarylist.iterator();
        System.out.print("工人工资升序排序:");
        while (Salaryiter.hasNext()) {
            int salary = Salaryiter.next();
            System.out.print(salary + "  ");
        }
        System.out.println("");
        //旋转链表
        Collections.reverse(Salarylist);
        Salaryiter = Salarylist.iterator();
        System.out.print("工人工资降序排序:");
        while (Salaryiter.hasNext()) {
            int salary = Salaryiter.next();
            System.out.print(salary + "  ");
        }
    }

}

 

 

 

 

上一篇:《假如正在面试》集合篇:Collections.sort底层排序方式是什么?


下一篇:java集合框架:Collections集合工具类