使用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#缺少它,则必须完全重写。
编辑第二部分:发现自己做错了。我应该设置和更改我正在检查的区域的边界,并基于此创建新的支点。
Collections.sort()
呢? - fge