如果它没有排序(或者保存在可以帮助搜索的成员之间存在关系的数据结构中),那么您将不得不检查每个成员以找到正确的成员。
最简单的解决方案可能是对其进行排序,然后进行二分切/搜索以找到符合您条件的元素。
如果您想提高仍然采用未排序数组的能力,请sorted
在数组的某处维护一个标志(即,将整个事物转换为包含指标和数组的类),以指示列表已排序。
false
然后在数组更改时将此标志设置为。
在您想要进行搜索的地方,您首先检查sorted
标志并对数组进行排序(如果它设置为) false
(将其设置true
为该过程的一部分)。如果标志是true
,则绕过排序。
这样,您只在需要时进行排序。如果数组自上次排序后没有改变,则重新排序没有意义。
如果用户需要,您还可以维护原始的未排序列表,将排序列表保留为类中的附加数组(对数组进行分类的另一个优点)。这样,你什么都不会失去。您拥有可供用户获取的原始未触及数据,以及一种快速有效地找到所需元素的方法。
您的对象(排序后)将包含:
int[] lows = {0,9,0,0,5,0,0,8,4,1,3,0,0,0,0};
int[] sortedlows = {0,0,0,0,0,0,0,0,0,1,3,4,5,8,9};
boolean isSorted = true;
如果您随后更改that_object[0]
为3
,您最终会得到:
int[] lows = {3,9,0,0,5,0,0,8,4,1,3,0,0,0,0};
int[] sortedlows = {0,0,0,0,0,0,0,0,0,1,3,4,5,8,9};
boolean isSorted = false;
表示在搜索之前需要排序sortedLows
。
请记住,将其变成课程并不是必需的。如果您担心它的性能(特别是通过 getter 方法访问数组元素),您可以维护数组并标记自己,同时仍然允许直接访问未排序的数组。您只需确保代码中更改数组的每个位置也正确设置了标志。
但是你应该在走这条路之前测量性能。基于类的方式“更安全”,因为对象本身控制着整个事物。