使用Java,我有一个类,被称为TestClass中,其中有一个名为名成员,这是一个字符串。我也有一个这种类型的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:想通了我在做什么错。我应该设置并更改我检查区域的边界,并基于此创建新的支点,而不是使用之前的支点。
你为什么不只是插入所有元素,然后使用'Collections.sort()'? – fge
也许我没有看这个权利,但是如果您确定该值在选定(测试)点之后__ _ _ _ _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ _ _ _ _ _ _ – lurker
@fge,尽管速度并不是我最关心的问题,但每次插入之后都会采用最慢的方法,因为不会有很多对象快速移入和移出。 – user2423158