1

我目前正在尝试学习 Java,并且正在尝试通过实现自己的容器类来做到这一点。我的问题是:
如果我已经实现了三个不同的容器类,并且我确实希望能够以三种不同的方式对它们中的每一个进行排序,所以我有:

Container_one with sort_1, sort_2, sort_3  
Container_two with sort_1, sort_2, sort_3  
Container_three with sort_1, sort_2, sort_3  

其中 sort_1、sort_2 和 sort_3 在每个容器中都是相同的算法(但它们彼此不同),有没有办法只实现一次,然后在其他容器中重用它们,还是每次我都必须实现它们m 实施新容器?
谢谢。

4

3 回答 3

3

将算法与它们操作的数据结构分开的一种方法是考虑实现算法所需的操作,将这些操作抽象为接口,根据接口对算法进行编码,并拥有所有数据结构实现接口。

例如,假设您的排序算法需要一种方法来比较位置i和的项目j,以及交换项目i和的方法j。然后您的界面将如下所示:

interface Sortable {
    int compare(int i, int j);
    void swap(int i, int j);
}

现在您可以按照以下方式实现分拣机Sortable

void sort1(Sortable container) {
    // first way to sort
}

void sort2(Sortable container) {
    // second way to sort
}

最后,让你的容器实现Sortable

class CoolContainer1 implements Sortable {
    public int compare(int i, int j) {
        ...
    }
    public void swap(int i, int j) {
        ...
    }
    // other operations
}

class CoolContainer2 implements Sortable {
    public int compare(int i, int j) {
        ...
    }
    public void swap(int i, int j) {
        ...
    }
    // other operations
}

请注意,以上所有内容只是对您的学习练习的建议。Java 提供了强大的排序工具,适用于列表和数组,并允许您将排序顺序指定到尽可能小的细节。循环查看该Collections.sort方法以获取更多信息。

于 2012-06-30T15:19:22.753 回答
1

排序算法应外化为三个Sorter类或静态sort(Container)方法,并以容器为参数进行排序。如果容器都实现了一个通用接口,您可以使用相同的算法对它们进行排序。

公共接口应该只包含获取容器大小、获取给定索引处的元素以及设置给定索引处的元素的方法。这足以对容器进行分类。

或者它可以有两种方法:一种提供包含容器所有元素的数组,另一种使用(排序的)数组的所有元素重新初始化它。

您正在重新实现java.util.Listand java.util.Collections.sort();

于 2012-06-30T15:22:56.390 回答
0

将算法与容器分开。例如:

interface SortAlgorithm { ... }

class Sort1 implements SortAlgorithm { ... }

然后使用排序算法参数化每个 Container:

class Container1 { public Container(SorthAlgorithm alg) {...} ... }

aContainer = new Container1(new Sort1()) 

查看Java 库的SortedSet层次结构。

每个可排序集合都可以使用用于比较项目的逻辑(比较器)进行参数化。

通常“排序算法”(不是比较方法)与集合的内部结构(即平衡树)紧密耦合,这就是为什么“共享”比较方法而不是整个排序算法更有意义的原因。

于 2012-06-30T15:21:00.520 回答