С 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: Выяснил, что я делаю неправильно. Вместо того, чтобы использовать предыдущую опорную точку, я должен был установить и изменить границы области, которую я проверял, и создать на ней новый опорный стержень.
Почему вы не просто вставьте все элементы, затем используйте 'Collections.sort()'? – fge
Возможно, я не смотрю на это правильно, но если вы определите, что значение идет _after_ выбранной (тестовой) точки, разве вы не проверите _second_ половину массива? – lurker
@fge, прибегая к каждой вставке, вероятно, будет самым медленным путем, хотя скорость не является моей самой большой проблемой, так как вряд ли многие объекты будут быстро перемещаться и выходить. – user2423158