Java 期望排序列表是一种糟糕的设计吗?

Java 期望排序列表是一种糟糕的设计吗?,java,algorithm,Java,Algorithm,假设我希望用Java解决这个问题 由于只要输入列表已经排序,就很容易解决问题,所以如果我的API方法需要排序的输入,那么这是一个糟糕的设计吗 我假设我的API方法不会控制数据源和输入列表填充。我认为这是编写API时通常的假设 我还假设输入可能非常大(大约一百万个项目) 对上游实施此类限制是否过于严格 编辑:我引用了那个问题作为例子。我的意思是说,从一开始(插入元素时)就对数字列表进行排序是否更有意义?由于当集合已经排序或从数据流的最开始排序的数字列表时,数字集合上的大多数问题通常都很容易出现,

假设我希望用Java解决这个问题

由于只要输入列表已经排序,就很容易解决问题,所以如果我的API方法需要排序的输入,那么这是一个糟糕的设计吗

我假设我的API方法不会控制数据源和输入列表填充。我认为这是编写API时通常的假设

我还假设输入可能非常大(大约一百万个项目)

对上游实施此类限制是否过于严格


编辑:我引用了那个问题作为例子。我的意思是说,从一开始(插入元素时)就对数字列表进行排序是否更有意义?由于当集合已经排序或从数据流的最开始排序的数字列表时,数字集合上的大多数问题通常都很容易出现,因此JDK方法
Collections.binarySearch()
在其文档中规定:

列表必须按照自然顺序按升序排序 其元素的排序(通过
排序(列表)
方法) 打这个电话。如果未排序,则结果未定义。如果 列表包含多个与指定对象相等的元素, 无法保证会找到哪一个

当然,这需要您已经阅读并理解此方法的先决条件。问题还在于,如果列表未排序,则不会出现错误,但会出现未定义的行为(即通常返回错误的索引)。这听起来显然不是一个好的设计

然而,有什么替代方案?您不能在方法内部调用
sort()
,当列表已经排序时,这将太昂贵,更不用说调用该方法的副作用是排序列表时的混乱了


因此,正如您所看到的,在某些情况下,我们需要做一些先决条件,以避免更糟糕的设计。如果程序员没有阅读文档,那就不是API制造商的错。当然,你想让你的代码直观易用,但有时这是不可能或不现实的。

我认为这是一个糟糕的设计

为什么?

@Kayaman已经说过,一个提供未分类列表的来电者可能会得到错误的结果,并且不会暗示他做错了什么

第二个原因:将实现细节传播到API设计中。可能还有其他不需要对列表进行排序的实现(例如,在未排序的列表上,三个数字的乘积可以用O(n)完成)

因此:

  • 提供处理未排序列表的方法
  • 如果您的调用者可能已经为您准备好了列表的排序版本,请添加第二个方法,该方法的名称明确说明需要排序列表

或者,如果从上下文中确定列表始终是排序的,则不应将其用作普通列表,而应封装在一个类中,以保证“排序”属性。

它不是“在排序数组中查找3个数字的最大乘积”。如果我使用的api需要排序列表,或者如果列表没有排序,则性能很差,我会认为这是一个糟糕的设计。谢谢@SamOrozco。我们通常看不到排序输入被询问,所以我问了这个问题。@user2357112:我引用了这个问题作为例子。我的意思是说,从一开始(插入元素时)就对数字列表进行排序是否更有意义?因为当集合已经排序或从一开始就排序的数字列表也有一些缺点时,数字集合上的大多数问题通常很容易解决?感谢您的回答,并指出JDK中的示例!!我更同意第二个原因。我猜JDK方法
Collections.binarySearch()
需要一个排序列表,因为这是二进制搜索的一个强制性条件,没有其他方法。