android-nuc / 17_Java_Train

17级 Android 实验室 Java 培训
12 stars 2 forks source link

1607084132郭朕 #3

Open wowGZ opened 6 years ago

wowGZ commented 6 years ago
//code
public class baseSort {
    public void sort(int[] a){
        System.out.println("排序算法");
    }
}
public class choiceSort extends baseSort{
    @Override
    public void sort(int[] a) {
        for (int i = 0; i < a.length; i++) {
            int min = i;
            for (int j = i + 1; j < a.length; j++) {
                if(a[min] > a[j]){
                    min = j;
                }
            }
            if(i != min){
                int temp = a[min];
                a[min] = a[i];
                a[i] = temp;
            }
        }
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }
}
public class insertSort extends baseSort{
    @Override
    public void sort(int[] a) {
        int i, j, insertNote;
        for (i = 1; i < a.length; i++) {
            insertNote = a[i];
            j = i - 1;
            while (j >= 0 && insertNote < a[j]) {
                a[j + 1] = a[j];
                j--;
            }
            a[j + 1] = insertNote;
        }
        for (int k = 0; k < a.length; k++) {
            System.out.print(a[k] + " ");
        }
    }
}
public class quickSort extends baseSort{
    @Override
    public void sort(int[] a) {
        QuickSort(a, 0, a.length - 1);
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
    }
    public void QuickSort(int[] a, int low, int hight){
        int i, j, index;
        if (low > hight) {
            return;
        }
        i = low;
        j = hight;
        index = a[i];
        while (i < j) {
            while (i < j && a[j] >= index) {
                j--;
            }
            if (i < j) {
                a[i++] = a[j];
            }
            while (i < j && a[i] < index) {
                i++;
            }
            if (i < j) {
                a[j--] = a[i];
            }
        }
        a[i] = index;
        QuickSort(a, low, i - 1);
        QuickSort(a, i + 1, hight);
    }
}
public class factory {
    private baseSort sort;
    //依赖注入
    public void setSort(baseSort sort){
        this.sort = sort;
    }
    public void doSort(int[] a){
        sort.sort(a);
    }
}
import java.util.Scanner
public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] a = new int[5];

//        数组初始化
        for (int i = 0; i < a.length; i++) {
            a[i] = scanner.nextInt();
        }

//        输出数组排序前的顺序
        System.out.println("数组排序前顺序如下:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();
//        数组选择排序后的顺序
        System.out.println("选择排序后的顺序如下:");
        factory f = new factory();
        baseSort selectsort = new choiceSort();
        f.setSort(selectsort);
        f.doSort(a);
        System.out.println();
//        数组快速排序后的顺序
        System.out.println("快速排序后的顺序如下:");
        baseSort quicksort = new quickSort();
        f.setSort(quicksort);
        f.doSort(a);
        System.out.println();
//        数组插入排序后的顺序
        System.out.println("插入排序后的顺序如下:");
        baseSort insertsort = new insertSort();
        f.setSort(insertsort);
        f.doSort(a);
        System.out.println();
    }
}
wowGZ commented 6 years ago

抽象类和借口的相同点

wowGZ commented 6 years ago

设计模式:策略模式

设计一个抽象策略类,以及若干个实现具体功能的抽象策略类的具体策略类。这样,在主函数中可以通过向上转型来实现具体功能,而且以后如果需要增加更多的具体策略类,不需要重新写主函数以及抽象策略类的代码,只需要按照要求增加对应的具体策略类,就可以对其进行调用。 以第一次写的排序算法作为例子:

首先,设计好一个策略抽象类——BaseSort类

abstract class BaseSort {
    public void sort(int[] a){
    }
}

然后设计对应的具体策略类,比如:选择排序、快速排序、插入排序等等(以下以这三种为例)

public class Person { private BaseSort sort;

public void setSort(BaseSort sort){
    this.sort = sort;
}

public void doSort(int[] a){
    sort.sort(a);
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    Person person = new Person();
    int[] a = new int[5];

// 数组初始化 for (int i = 0; i < a.length; i++) { a[i] = scanner.nextInt(); }

// 输出数组排序前的顺序 System.out.println("数组排序前顺序如下:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } System.out.println();

    System.out.println("请问您想要使用什么排序方法对此数组进行排序?");
    System.out.println("1、选择排序;");
    System.out.println("2、快速排序;");
    System.out.println("3、插入排序;");

    int i = scanner.nextInt();
    switch (i) {
        case 1:
            person.setSort(new SelectSort());              //向上转型调用子类重写的方法
            person.doSort(a);
        case 2:
            person.setSort(new QuickSort());              //向上转型调用子类重写的方法
            person.doSort(a);
        case 3:
            person.setSort(new InsertSort());              //向上转型调用子类重写的方法
            person.doSort(a);
        default:
            System.out.println("您输入的数据有误!");
    }
}

}


### 优点:
- 对于子类数据的封装更彻底;
- 使得整个代码的结构更加清晰明了
### 缺点:
- 随着具体策略类的增加子类会越来越多,个人感觉会不那么容易管理,而且所占空间会越来越多。
wowGZ commented 6 years ago

遍历集合的一些操作

public class Traversal{

public void  traversal_fori(ArrayList<Person> t){            //fori遍历
    System.out.println("使用fori循环遍历集合结果如下:");
    for (int i = 0; i < t.size(); i++) {
        System.out.println("年龄:" + t.get(i).getAge() + "姓名:"+ t.get(i).getName());
    }
}

public void  traversal_foreach(ArrayList<Person> t){                 //foreach遍历
    System.out.println("使用foreach循环遍历集合结果如下:");
    for (Person s:
            t) {
        System.out.println("年龄:" + s.getAge() + "姓名:"+ s.getName());
    }
}

public void traversal_iterator(ArrayList<Person> t){
    Iterator<Person> personIterator = t.iterator();
    System.out.println("使用迭代器遍历集合结果如下:");
    while(personIterator.hasNext()){
        Person person = (Person)personIterator.next();
        System.out.println("年龄:" + person.getAge() + "姓名:"+ person.getName());
    }
}

}

- 以上是设计的Traversal类的代码,下面让我们设计一个Test类对以上Traversal类进行一下测试
```java
import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {

        ArrayList<Person> students = new ArrayList<>();
        students.add(new Person(2 , "b"));
        students.add(new Person(1 , "a"));
        students.add(new Person(3 , "c"));
        students.add(new Person(4 , "d"));
        students.add(new Person(5 , "e"));
        students.add(new Person(6 , "f"));
        students.add(new Person(7 , "g"));
        students.add(new Person(8 , "h"));
        students.add(new Person(9 , "i"));
        students.add(new Person(10, "j"));

        Traversal traversal = new Traversal();
        traversal.traversal_fori(students);
        traversal.traversal_foreach(students);
        traversal.traversal_iterator(students);
    }
}