在 Java 中,我有一个名为 TestClass 的类,它有一个名为 Name 的成员,它是一个字符串。我也有一个这种类型的 ArrayList,它已经按名称按字母顺序排序。我想要做的是找到放置TestClass 的新实例的最佳索引。到目前为止,我能想到的最好的方法是:
public static int findBestIndex(char entry, ArrayList<TestClass> list){
int desiredIndex = -1;
int oldPivot = list.size();
int pivot = list.size()/2;
do
{
char test = list.get(pivot).Name.charAt(0);
if (test == entry)
{
desiredIndex = pivot;
}
else if (Math.abs(oldPivot - pivot) <= 1)
{
if (test < entry)
{
desiredIndex = pivot + 1;
}
else
{
desiredIndex = pivot - 1;
}
}
else if (test < entry)
{
int tempPiv = pivot;
pivot = oldPivot - (oldPivot - pivot)/2;
oldPivot = tempPiv;
}
else
{
int tempPiv = pivot;
pivot = pivot - (oldPivot - pivot)/2;
oldPivot = tempPiv;
}
} while (desiredIndex < 0);
return desiredIndex;
}
本质上,将数组分成两半,检查您的值是否在该点之前、之后或之后。如果在之后,请检查数组的前半部分。否则,请检查下半场。然后,重复。我知道这种方法只测试第一个字符,但这很容易解决,与我的主要问题无关。对于某些情况,这种方法效果很好。对于大多数人来说,它的效果很糟糕。我假设它没有正确找到新的枢轴点,如果是这种情况,我将如何解决它?
编辑:为澄清起见,我将其用于库存系统,所以我不确定 LinkedList 是否合适。我使用 ArrayList 是因为它们对我来说更熟悉,因此在需要时更容易翻译成另一种语言(目前可能正在转移到 C#)。出于这个原因,我试图避免使用 Comparable 之类的东西,因为如果 C# 缺少它,我必须完全重新编写它。
编辑部分 Duex:弄清楚我做错了什么。我应该设置和更改我正在检查的区域的边界,而不是使用以前的枢轴点,并以此为基础创建新的枢轴点。