Einfügen in eine bereits sortierte Liste

Mit Java, habe ich eine Klasse, bekannt als Testklasse, die ein Element mit dem Namen Name, das ist ein string. Ich habe auch eine ArrayList von dieser Art, die bereits die alphabetisch nach Namen sortiert. Was ich tun möchte, ist zu finden die besten index, in dem Sie eine neue Instanz von Testklasse. Der beste Ansatz, den ich kommen könnte, so weit ist diese:

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;
}

Im wesentlichen, Brechen Sie die Reihe in der Hälfte, zu überprüfen, ob Ihr Wert geht vor, nach, oder in diesem Punkt. Wenn es nach prüfen der ersten Hälfte des Arrays. Andere weisen, überprüfen Sie die zweite Hälfte. Dann wiederholen. Ich verstehe, dass diese Methode nur tests, die von dem ersten Zeichen, aber das ist leicht behoben, und nicht relevant für mein Haupt-problem. Für einige Szenarien, dieser Ansatz funktioniert gut genug. Für die meisten, es funktioniert schrecklich. Ich gehe davon aus, dass es nicht die Suche nach einem neuen pivot-Punkt richtig, und wenn das der Fall ist, wie kann ich es beheben?

Edit: Zur Klarstellung, ich bin mit diesem für ein Inventar-system, so dass ich nicht sicher bin, ob eine LinkedList angemessen wäre. Ich bin mit einer ArrayList, weil Sie mehr sind mir vertraut, und so wäre es einfacher zu übersetzen in eine andere Sprache, falls erforderlich (was wahrscheinlich ist, im moment, vielleicht verschieben auf C#). Ich bin versucht zu vermeiden, Dinge wie Vergleichbares aus diesem Grund, als müsste ich komplett neu schreiben, wenn C# fehlt es.

Teil Bearbeiten Duex: herausfinden, was ich falsch machte. Anstelle der Verwendung des vorherigen drehpunkts, ich hätte die Einstellung und änderung der Grenzen des Bereichs, ich war die überprüfung und das erstellen der neuen pivot.

Warum gehst du nicht einfach fügen Sie alle Elemente, dann verwenden Sie Collections.sort()?
Vielleicht bin ich nicht auf der Suche auf dieses Recht, aber wenn Sie feststellen, dass der Wert geht nachdem die ausgewählten (test) zeigen Sie, würden Sie nicht überprüfen Sie die zweite die Hälfte von dem array?
greifen nach jedem einfügen würde wahrscheinlich die langsamste Weg zu gehen, obwohl Geschwindigkeit ist nicht meine größte Sorge, da wird es wahrscheinlich nicht werden, viele Objekte verlagert-in und-out schnell.
das ist es, was ich versuche zu tun, aber wahrscheinlich mein Versuch dabei war völlig falsch, und das ist, wo ich bin mit dem problem.
es hängt davon ab, wie oft diese sortierte Liste zugegriffen wird. Wenn nicht, oft können Sie nur rekonstruieren, dass die Liste bei Bedarf.

InformationsquelleAutor user2423158 | 2013-05-26

Schreibe einen Kommentar