JavaSE高级程序设计总结、训练——集合的基本使用方法总结1(List接口)

集合的基本使用方法总结

一、 ArrayList 集合的使用方法

讲讲对象数组的排序

这里我就主要记录排序的使用,我个人比较建议用Comparetor的比较器去做排序,范例代码如下:

import java.util.*;

/**
 * @author jiangzl
 */
public class MyArrayList {
    
    
    public static void main(String[] args){
    
    
        ArrayList myListOfTask = new ArrayList<Arraytask>();
        Scanner sc = new Scanner(System.in);
        for(int i = 0;i < 5;++i){
    
    
            String name = sc.next();
            int prio = sc.nextInt();
            myListOfTask.add(new Arraytask(name, prio));
        }
        sc.close();

        System.out.println("---------排序前---------");
        for(int i = 0;i < 5;++i){
    
    
            System.out.println(myListOfTask.get(i));
        }

        System.out.println("---------排序后---------");
        Collections.sort(myListOfTask, new Comparator<Arraytask>() {
    
    
            @Override
            public int compare(Arraytask tk1, Arraytask tk2) {
    
    
                if(tk1.getTaskPriority() != tk2.getTaskPriority()){
    
    
                    return tk2.getTaskPriority() - tk1.getTaskPriority();
                }
                else{
    
    
                    return tk1.getTaskName().compareTo(tk2.getTaskName());
                }
            }
        });

        for(int i = 0;i < 5;++i){
    
    
            System.out.println(myListOfTask.get(i));
        }
    }
}

/**
 * @author jiangzl
 */
class Arraytask{
    
    
    private String taskName;
    private int taskPriority;

    public Arraytask(String name, int prio){
    
    
        this.taskName = name;
        this.taskPriority = prio;
    }

    public String getTaskName(){
    
    
        return taskName;
    }

    public int getTaskPriority(){
    
    
        return taskPriority;
    }

    @Override
    public String toString(){
    
    
        return new String("任务名:" + taskName + " , 任务优先级:" + taskPriority);
    }
}
Comparetor比较器的使用方法说明:

写好一个类之后,需要对这个类的对象数组进行排序,我们可以使用集合的方法:

Collection.sort(对象数组名(ArrayList 的对象名), new Comparetor<类名(泛型)>(){
    
    
			@Override
            public int compare(类名 obj1, 类名 obj2) {
    
    
                /……/
            }
})
需要注意的点:

① 这里的compare函数的返回值是int类型的,如果返回正数表示前面的对象obj1大于obj2,负数是小于,0当然就是相等了。

② 如果要表现某种优先级,这里和c++完全相反的一点就是,默认情况下是obj2(后面的)优先级高于obj1(前面的)。比方说我的示例代码里:

			@Override
            public int compare(Arraytask tk1, Arraytask tk2) {
    
    
                if(tk1.getTaskPriority() != tk2.getTaskPriority()){
    
    
                    return tk2.getTaskPriority() - tk1.getTaskPriority();
                }
                else{
    
    
                    return tk1.getTaskName().compareTo(tk2.getTaskName());
                }
            }

代表的含义就是:
(1)如果两个任务优先级不相同,则让优先级高的排在前面。因为默认是后面的排在前面,于是乎,我们就返回:当符合我们设计的优先级时,返回一个大于0的数。于是如果是优先级高的在前面,那么Comparetor的比较机制是后面的在前,于是我们设计后面的值大于前面,也就是相减大于1的时候调用。( 备注 :这里可能不好理解……是我文笔不好,写不清楚)

(2)总的来说归结为一点:如果你想要按照某个参考值升序排序,就让前面的对象obj1大于后面的,也就是obj1.val - obj2.val。比方说我们想要优先级相同的时候,name按照字典序升序排序,于是让第一个对象的name减去第二个对象的name,按照大于0(也就是升序)排序!反之,就让后面的减去前面的。

简单讲讲对象数组(ArrayList )的增删改查

(1)遍历读取元素

这个还是很简单的,如果只是“读”操作,最好的方法(效率最高的)就是:

		int len = (ArrayList对象) arrayObj.size();
		for(int i = 0;i < len;++i){
    
    
            /……/
            类名 obj = arrayObj.get(i);
            /……/
        }

这种 “读” 操作下的效率是最高的,比foreach效率要高(实验测试的结果)。

(2)修改元素
		int len = (ArrayList对象) arrayObj.size();
		for(int i = 0;i < len;++i){
    
    
            /……/
            类名 update = new 类名(……) // 你的新改的对象
            类名 obj = arrayObj.set(i, update);
            /……/
        }
(3)删除元素
		int len = (ArrayList对象) arrayObj.size();
		for(int i = 0;i < len;++i){
    
    
            /……/
            类名 remv = arrayObj.remove(i); // remv 就是你要删除的对象
            /……/
        }

增删改查的一些说明&总结:

读取用 get(index), 修改用 set(index, newObj), 删除用 remove(index)
但是他们三个的返回值都是对象!!!这个是需要注意的!
而且ArrayList是基于向量的数据结构,是可以随机访问的!所以从这个底层来看,肯定是读写效率高,删除、增加效率低。所以有了后面的LinkedList集合

二、 LinkedList 集合的使用方法

讲讲Iterator接口与LinkedList的遍历

先来看一个示例程序:

import java.util.*;

/**
 * @author jiangzl
 */
public class MyLinkedList {
    
    
    public static void main(String[] args){
    
    
        LinkedList myList = new LinkedList<Student>();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for(int i = 0;i < n;++i){
    
    
            String name = sc.next();
            int age = sc.nextInt();
            myList.add(new Student(name, age));
        }

        String delName = sc.next();
        Iterator<Student> it = myList.iterator();
        while(it.hasNext()){
    
    
            if(it.next().getName().equals(delName)){
    
    
                it.remove();
                break;
            }
        }

        while (it.hasNext()){
    
    
            System.out.println(it.next());
        }
    }
}

/**
 * @author jiangzl
 */
class Student{
    
    
    private String name;
    private int age;

    public Student(String name, int age){
    
    
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString(){
    
    
        return new String("姓名:" + name + " , 年龄:" + age);
    }

    public String getName(){
    
    
        return name;
    }
}

这里先讲一下LinkedList的遍历

我们采用迭代器Iterator类进行遍历,用hasNext()方法判断是否有下一个值,然后用next()来获取当前遍历到的对象!然后该干啥操作就干啥操作了!

 		Iterator<类名> it = myList.iterator();
        while(it.hasNext()){
    
    
            类名 obj = it.next();
            /……/
        }

再说说ListIterator接口,这里 最大的差距就是,ListIterator支持并发执行,而Iterator不支持! 举个小例子看看:

import java.util.*;
import java.util.ListIterator;

public class MyListIterator {
    
    
    public static void main(String[] args){
    
    
        List myList = new ArrayList();
        myList.add("stu1");
        myList.add("stu2");
        myList.add("stu3");
        myList.add("stu4");
        myList.add("stu5");
        ListIterator it = myList.listIterator();

        while(it.hasNext()){
    
    
            if("stu2".equals(it.next())){
    
    
                it.remove();
                it.add("hello");
                break;
            }
        }

        it = myList.listIterator();
        while(it.hasNext()){
    
    
            System.out.println(it.next());
        }
    }
}

再看看控制台输出的结果:
在这里插入图片描述

很明显我们能够看到:
① ListIterator 接口可以使用 add() 方法,可以在当前迭代器的位置进行插入操作
② ListIterator 接口比如在某次遍历完成后,如果需要再次遍历这个对象数组,就必须重新:

it = myList.listIterator();

③ Iterator 接口是只读是属性,要想修改,还是得用 ListIterator 比方说上面修改 ”stu2“ 成为 “hello”

然后讲一下增删改查

这个其实就很简单了,如果使用ListIterator,不光可以实现Iterator 的 it.remove(); 完成删除当前迭代器指向的对象。还可用 add(obj); 的方法完成在当前迭代器指向的位置后插入对象obj。
就像示例里的这段代码:

		while(it.hasNext()){
    
    
            if(it.next().getName().equals(delName)){
    
    
                it.remove();
                break;
            }
        }

        while (it.hasNext()){
    
    
            System.out.println(it.next());
        }

所有的操作都靠:it.next(); 来获取当前遍历到的对象,然后操作他!

最后总结一下List接口继承自Collection后拓展出来的方法:

在这里插入图片描述
其他的一些方法,我就不谈了,大多数都很简单。

猜你喜欢

转载自blog.csdn.net/qq_44274276/article/details/107774974