关于数组:Java:接口和抽象类的实现

Java: Implementation of Interfaces and abstract classes

我正在尝试构建一个程序,在该程序中,我可以在对int数组进行排序时对其进行可视化表示。有两种不同的搜索算法可供选择。所有功能都分为类、接口和抽象类。我的主要问题是从一件事到下一件事获取数据。

我的主类实现了基本的窗口功能。绘制窗口,几个选择搜索算法的按钮,提供一个文本字段来输入数组,并在其中心显示数组的条形图可视化。在扩展JComponent的类中绘制条。这也是我将数字串转换成int数组的地方。我已经可以绘制图形,更改数组,它也可以绘制。

现在我有了一个名为Sorter的接口,它提供了以下方法。

1
2
3
4
5
public void setUpTo( int i ); // to limit the number of swaps during the search
public void setNumbers( int[] numbers );
public void sort();
public String getName();
public int getSwaps();

然后我有实现Sorter的抽象类CountingSort和扩展CountingSort的类CountingBubbleSort。这对我来说都很困惑。在我的主类中,我听一个按钮来传递textfield的内容并开始排序。我需要做什么才能使int数组通过CountingSort进入CountingBubbleSort?我已经实施了CountingBubbleSort

告诉我需要提供哪些附加信息。


如果您将另一个方法添加到您的Sorter接口(getNumbers()中),它将保证所有Sorter实现都将有一个getter和setter到内部int数组。

1
2
3
4
5
interface Sorter {
    public int[] getNumbers();
    public void setNumbers(int [] numbers);
    //... other methods....
}

然后,如果您在抽象的CountingSort类中这样实现它,那么您就可以使用这些方法,而无需在所有子类中实现它们。

1
2
3
4
5
6
7
8
9
10
11
12
13
abstract class CountingSort implements Sorter{
    private int [] mNumbers;

    @Override
    public int[] getNumbers() {
        return mNumbers;
    }

    @Override
    public void setNumbers(int[] numbers) {
        mNumbers = numbers;
    }
}

然后,您可以随时访问具体实现中的数字(如果设置了这些数字)。我建议在CountingBubbleSort中使用一个构造函数,它接受int数组(或随机生成它,不管您想创建它)。此构造函数可以移到抽象类:

1
2
3
4
5
6
7
8
9
class CountingBubbleSort extends CountingSort{
    public CountingBubbleSort(int [] numbers){
        setNumbers(numbers);
    }

    public void someOtherMethod(){
        int [] numbers = getNumbers();
    }
}

在您的主类中,您可以使用继承必须提供的内容,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MainClass {
    private Sorter mSorter;

    public void doSort(){
        //Create sorter objects
        if(you want CountingBubbleSort){
            mSorter = new CountingBubbleSort();
        }else{
            mSorter = new BubbleSort();
        }
        //get the numbers
        int [] numbers = mSorter.getNumbers();

        // do the sorting
        mSorter.sort();
    }
}