Java学习笔记十九(迭代器Iterator、泛型与Comparable接口)

迭代器Iterator

    迭代器是实现集合遍历的一种方法。集合遍历的常用方法有三种:for循环、Iterator迭代器和增强for循环(或称高级迭代)。Collection接口提供了相应的方法Iterator()来获取接口的实现类对象(所有Collection的子类都有这个方法)。

    Iterator类的常用API:

           boolean  hasNext()            //询问集合中有没有下一个元素

           E  next()                            //取出下一个元素

          void remove()                    //删除取出的元素(使用迭代器期间,不能通过调用集合的增删改查方法进行操作)

    具体实现:

           for(Iterator it = 集合对象.iterator();it.hasNext();){

                    集合对象的类  a = (集合对象的类)it.next();

                    //it.remove()    移除获取的元素则调用这个方法

                    System.out.println(a);

           }

      增强for循环的具体实现(底层实现是迭代器,使用形式:元素的类型  随便一个变量:要遍历的集合啥的):

             List<Integer> list = new List<Integer>();

             for(int i=0;i<3;i++)

                    list.add(i);

             for(Integer a : list)

                    System.out.println(a);

泛型

      在JDK1.5之后添加的新特性,作用是对集合进行“参数化类型”,防止使用向下造型产生错误。集合可以规定元素的类型,编译器会在集合进行增删操作时,检查元素类型是否匹配,避免错误。

      同样,集合框架中的所有类型都添加了泛型机制。

      定义泛型: 在类名后面加<E>       (加别的字母也可以但是习惯用E或者T)

      具体实现:

             public class MyArrayList<E> {
                        Object arr[];
                        public MyArrayList(){
                                    arr = new Object[8];
                          }
                        public void add(Object o) {
                          }

             }

            public class Person<K,V> {

                        K k;
                        V v;
                        public Person(K k,V v){
                                this.k=k;
                                this.v=v;
                         }
                }

             public class TestFanxing {
                        public static void main(String[] args) {
                        MyArrayList<Person> person = new MyArrayList<Person>();
                        Person<String,Integer> p1 = new Person<String,Integer>("张三",93);
                        Person<String,Integer> p2 = new Person<String,Integer>("李四",91);
                        person.add(p1);
                        person.add(p2);
                        }

                }

Comparable接口

       集合存在一个工具类Collections,提供了很多方法,其中有对集合排序的sort()方法。

       sort(List<T> list)方法的底层实现是元素调用compareTo(E  e)方法和另外一个元素比较

       sort(List<T> list,Comparator<? super T> c)方法底层是两个元素调用compare(Object o1,Object o2)方法进行比较

        先不关心具体的实现sort方法,如果我们想实现集合的排序,需要实现Comparable或者Comparator接口,我认为实现他们俩谁都是一样的,是两种不同的方法。

(1) 实现Comparable接口:

package com.Collection;
public class Circle implements Comparable<Circle> {
	private double r;
	private int x;
	private int y;
	public Circle(double r, int x, int y) {
		super();
		this.r = r;
		this.x = x;
		this.y = y;
	}
	public double getR() {
		return r;
	}
	public void setR(double r) {
		this.r = r;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	@Override
	public String toString() {
		return "[" + r + "," + x + "," + y + "]";
	}
	@Override
	public int compareTo(Circle o) {                                          //重写compareTo方法
		int a = this.getX()*this.getX()+this.getY()*this.getY();
		int b = o.getX()*o.getX()+o.getY()*o.getY();
		return a-b;                                                       //实现升序
		}
	}
package com.Collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestCircle {
	public static void main(String[] args) {
		Circle c1 = new Circle(1,1,1);
		Circle c2 = new Circle(1,6,7);
		Circle c3 = new Circle(1,2,3);
		List<Circle> list = new ArrayList<Circle>();
		list.add(c1);
		list.add(c2);
		list.add(c3);
		Collections.sort(list);                          //继承接口后直接调用方法即可
		System.out.println(list);
		}
			
}

(2) 实现Comparator接口

 Circle类与上相同,但是不需要实现接口了,自然也不需要重写方法了,Test类有改变

package com.Collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestCircle {
	public static void main(String[] args) {
		Circle c1 = new Circle(1,1,1);
		Circle c2 = new Circle(1,6,7);
		Circle c3 = new Circle(1,2,3);
		List<Circle> list = new ArrayList<Circle>();
		list.add(c1);
		list.add(c2);
		list.add(c3);
		Collections.sort(l,new Comparator<Circle>() {    //通过匿名内部类实现接口,重写compare方法
                @Override
                public int compare(Circle o1,Circle o2) {         
                    return o1.getY()-o2.getY();
                    }
                });
		System.out.println(list);
		}
}

对于重写compare方法时,将第二个参数和第一个参数比较,则是降序(也就是说返回的是true或者第二个数大于第一个数时)

反之升序。

猜你喜欢

转载自blog.csdn.net/weixin_40373090/article/details/80788380
今日推荐