我正在尝试学习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在每个容器中是相同的算法(但它们彼此不同),有没有办法只实现一次然后在其他容器中重用它们或者我必须每个都实现它们我正在实施新容器吗? 谢谢。
答案 0 :(得分: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
方法循环获取更多信息。
答案 1 :(得分:1)
排序算法应该外部化为三个Sorter
类或静态sort(Container)
方法,并将容器排序为参数。如果容器都实现了通用接口,则可以使用相同的算法对所有容器进行排序。
公共接口应该包含获取容器大小,获取给定索引的元素以及在给定索引处设置元素的方法。这足以能够对容器进行排序。
或者它可以有两个方法:一个提供包含容器所有元素的数组,另一个用(已排序)数组的所有元素重新初始化它。
您正在重新实现java.util.List
和java.util.Collections.sort()
;
答案 2 :(得分:0)
将算法与容器分开。例如:
interface SortAlgorithm { ... }
class Sort1 implements SortAlgorithm { ... }
然后使用排序算法对每个Container进行参数化:
class Container1 { public Container(SorthAlgorithm alg) {...} ... }
aContainer = new Container1(new Sort1())
查看Java库的SortedSet层次结构。
每个可排序集合都可以使用用于比较项目的逻辑(Comparator)进行参数化。
通常,“排序算法”(不是比较方法)与集合的内部结构(即平衡树)紧密耦合,这就是为什么“分享”比较方法更有意义而不是整体排序算法。