miracle just wanna be better

FileFilter和comparable

2019-07-18
miracle

listFiles(FileFilter)

public void testMethod14() {
		File file = new File("D:/aa");
		if (file.exists()) {
			File[] fs = file.listFiles(new FileFilter(){
				//回调函数
				@Override
				public boolean accept(File pathname) {
					
					return pathname.getName().endsWith(".txt");//过滤的条件
				}
			});
			for (File f : fs) {
				System.out.println(f);
			}
		} else {
			System.out.println("目录不存在");
		}
	}

过滤后的文件以数组存进fs里,该方法参数是FileFilter接口的子类,子类重写了接口accept方法,listFiles方法中调用了FileFilter的accept方法,参数用匿名内部类的方式重写accept方法,参数表示该目录下的文件对象

 public File[] listFiles(FileFilter filter) {
        String ss[] = list();
        if (ss == null) return null;
        ArrayList<File> files = new ArrayList<>();
        for (String s : ss) {
            File f = new File(s, this);
            if ((filter == null) || filter.accept(f))
                files.add(f);
        }
        return files.toArray(new File[files.size()]);
    }

这是回调函数,多态的典型

listFiles(FilenameFilter)

	public void testMethod15() {
		File file = new File("D:/aa");
		if (file.exists()) {
			File[] fs = file.listFiles(new FilenameFilter(){

				@Override
				public boolean accept(File dir, String name) {
					
					return name.endsWith("txt");
				}});
			for (File f : fs) {
				System.out.println(f);
			}
		} else {
			System.out.println("目录不存在");
		}
	}

}

过滤后的文件以数组存进fs里,该方法参数是FilenameFilter接口的子类,子类重写了接口accept方法,listFiles方法中调用了FileFilter的accept方法,参数用匿名内部类的方式重写accept方法,accept有两个参数,第一个参数表示路径,第二个参数表示文件名 看源码

 public File[] listFiles(FilenameFilter filter) {
        String ss[] = list();
        if (ss == null) return null;
        ArrayList<File> files = new ArrayList<>();
        for (String s : ss)
            if ((filter == null) || filter.accept(this, s))
                files.add(new File(s, this));
        return files.toArray(new File[files.size()]);
    }

这是多态,回调函数的典型

Comparable

Comparable接口只有一个方法–CompareTo()方法

package java.lang;
import java.util.*;
public interface Comparable<T> {
    public int compareTo(T o);
}
  • 若x.compareTo(y) <0,则x<y;若x.compareTo(y) =0,则x=y;若x.compareTo(y) >0,则x=y;
public void sortString(){
		ArrayList<String> strs = new ArrayList<String>();
		strs.add("hjk");
		strs.add("bcd");
		strs.add("wqr");
		strs.add("efg");
		strs.add("qaz");
		System.out.println("----------------原始循序----------------");
		for(String str:strs){
			System.out.println(str);
		}
		System.out.println("---------------开始循序----------------");
		Collections.sort(strs);
		System.out.println("---------------经过排序后输出----------------");
		for(String str:strs){
			System.out.println(str);
		}
	}

sort方法中使用了List中重写的compareTo方法,因为List已经实现了这个方法,所以就不用自己去实现了,当参数是List类型时,就会调用这个方法,实现排序

如果传入自己写的类类型怎么办? 是需要自己在类中重写compareTo方法的

public void sortStudent(){
		ArrayList<Student> students = new ArrayList<Student>();
		Student stu1 = new Student("zhangsan",20,"S001");
		Student stu2 = new Student("lisi",21,"S002");
		Student stu3 = new Student("wangwu",22,"S003");
		students.add(stu1);
		students.add(stu2);
		students.add(stu3);
		System.out.println("-----------------排序前------------------");
		for(Student stu : students){
			System.out.println("name="+stu.getName()
			+"age="+stu.getAge()
			+"stuNo="+stu.getStuNo());
		}
		System.out.println("-----------------开始排序------------------");
		Collections.sort(students);
		System.out.println("-----------------排序后------------------");
		for(Student stu : students){
			System.out.println("name="+stu.getName()
			+"age="+stu.getAge()
			+"stuNo="+stu.getStuNo());
		}
	}

Collections.sort(Student),Student重写compareTo方法

@Override
	public int compareTo(Student o) {
		//给name排序
		int value = this.getName().compareTo(o.getName());
		//给年龄排
		//int value = this.getAge()-o.getAge();
		//给stuNo排序
		//int value = this.getStuNo().compareTo(o.getStuNo());
		return value;
	}

Comparator

  • Comparator需要实现compare方法,用匿名内部类方式实现此方法,此方法是Comparator接口的方法
  • compare若compare(x,y) <0,则x<y;若compare(x,y) =0,则x=y;若compare(x,y)>0,则x=y;
//此方法是为了获取一个List集合
	public List<Teacher> getTeachers(){
		ArrayList<Teacher> teachers = new ArrayList<Teacher>();
		Teacher tea1 = new Teacher("zhangsan",21,18000);
		Teacher tea2 = new Teacher("lisi",20,19000);
		Teacher tea3 = new Teacher("王五",22,20000);
		teachers.add(tea1);
		teachers.add(tea2);
		teachers.add(tea3);

		return teachers;
	}
	//排序,根据指定Comparator的排序原则,按名称排序的策略实现
	public void sortName(List<Teacher> teachers){
		Collections.sort(teachers,new Comparator<Teacher>(){

			@Override
			public int compare(Teacher o1, Teacher o2) {
				int value = o1.getName().compareTo(o2.getName());
				return value;
			}});
	}
	//排序,根据指定Comparator的排序原则,按年龄排序的策略实现
	public void sortAge(List<Teacher> teachers){
		Collections.sort(teachers,new Comparator<Teacher>(){

			@Override
			public int compare(Teacher o1, Teacher o2) {
				int value = o1.getAge()-o2.getAge();
				return value;
			}});
	}
	//排序,根据指定Comparator的排序原则,按工资排序的策略实现
		public void sortSalary(List<Teacher> teachers){
			Collections.sort(teachers,new Comparator<Teacher>(){

				@Override
				public int compare(Teacher o1, Teacher o2) {
					int value = o1.getSalary()-o2.getSalary();
					return value;
				}});
		}

总结

如果有一种排序原则,用Comparable接口 如果有多种比较原则,就用Comparator接口

参数 Comparable Comparator
排序逻辑 排序逻辑必须在待排序对象的类中,故称之为自然排序 排序逻辑在另一个实现
实现 实现Comparable接口 实现Comparator接口
排序方法 int compareTo(Object o1) int compare(Object o1,Object o2)
触发排序 Collections.sort(List) Collections.sort(List, Comparator)
接口所在包 java.lang.Comparable java.util.Comparator

上一篇 装箱和String

下一篇 IO输入输出流

Comments

Content