Benötige Hilfe zu Sortieralgorithmus

foerstina

Grünschnabel
Moin!

Erst einmal ein freundliches Hallo an die Community :)
Der Grund für meinen Besuch bzw. meinen Post ist aber ein eher nicht erfreulicher:
Ich muss eine Projektarbeit in Java abgeben.
Jedoch entbehrt sich diese Arbeit jeder Logik, da ich nicht Informatik studiere im Gegenteil....ich studiere Naturwissenschaften und habe mich mein Leben lang nicht mit Programmieren beschäftigt. Das bedeutet meine Kenntnisse sind gleich null. Jedoch muss ich diese Arbeit abgeben.

Folgende Konstellation: Ich habe mir ein paar Videos angeschaut auf Youtube was das sortieren in Java angeht. Abgesehend avon, dass ich mit den ganzen Begriffen nichts anfangen kann, kann ich mir jedoch grob ausmalen was sie bedeuten. Und etwas ähnliches zu kreieren lässt sich vielleicht auch noch (mit entsprechender Beihilfe eurerseits sogar halbwegs gut hinbekommen).

Die Aufgabe: Sortieralgorithmus schreiben in Java. Ich würde aber gerne den Algorithmus so umschreiben können, dass ich zunächst ein Ordner auswähle und die entsprechenden Dokumente in besagtem Ordner nach Datum sortieren kann. Und da fängt der Spaß schon an.

Kann jemand mit mir die einzelnen Schritte Schritt für Schritt durchgehen, dass ich am Ende sogar verstanden habe was ich da eigentlich mache? Skype ist vorhanden.

Mit freundlichen Grüßen
Martin
 
Hi foerstina und Willkommen hier bei tutorials.de,

Vom groben Vorgehen her würde ich das so angehen:

- File-Object erstellen mit dem Ordner
- Mit Hilfe der listFiles() Methode erhältst du dann alle Dateien in dem Ordner
- Mit der statischen Arrays.asList() Methode kannst du das Array mit den Dateien in eine Liste umwandeln
- Diese Liste kannst du nun mit der sort() und einen eigenen Comparator sortieren

Das alles mal als kleine Stütze über den groben Ablauf. Wenn du noch weitere, konkrete Fragen hast, kannst die gerne hier dann stellen.

Grüße,
BK
 
Tut mir Leid aber ich habe komplett nichts verstanden :/
Ich bräuchte um das verstehen zu können jemanden der mich dort Schritt für Schritt durchlotst.

Trotzdem Danke schonmal :)

Grüße
Martin
 
Wirst du schon selber programmieren müssen. Ein Anfang wäre es doch schon mal, wenn du eine Main Methode hast, die wenigstens ein Hello World ausgibt. Anschließend kann man darauf aufbauen.
 
Selber programmieren versteht sich für mich ebenfalls von selbst. Nur wenn ich von etwas weniger als nichts verstehe ist es für mich sinnvoller eine Art Mentor zu haben der mich dadurch lotst. So etwas was du meintest habe ich bereits schon einmal ausprobiert.

Grüße
 
Sowas brauchst du

Code:
public class FileSortierer {

    private final static NaturalOrdering NATURAL_ORDERING = new NaturalOrdering();

    public static void main(String[] args) {
        FileSortierer fileSortierer = new FileSortierer();
        fileSortierer.sortiereFiles("D:/develop/dump");
    }

    public void sortiereFiles(String directory) {
        if (directory == null) {
            throw new IllegalStateException("Kein directory angegeben");
        }
        File ordner = leseOrdner(directory);
        sortiere(Arrays.asList(ordner.listFiles()));
    }

    private File leseOrdner(String directory) {
        File file = new File(directory);

        if (!file.exists()) {
            throw new IllegalStateException("File directory existiert nicht");
        }

        if (!file.isDirectory()) {
            throw new IllegalStateException("File ist kein directory");
        }
        return file;
    }

    private void sortiere(List<File> files) {
        Collections.sort(files, NATURAL_ORDERING);
        for (File file : files) {
            System.out.println(file.getName());
        }
    }
}

Code:
public class NaturalOrdering implements Comparator<File> {
        int compareRight(String a, String b)
        {
            int bias = 0;
            int ia = 0;
            int ib = 0;

            // The longest run of digits wins. That aside, the greatest
            // value wins, but we can't know that it will until we've scanned
            // both numbers to know that they have the same magnitude, so we
            // remember it in BIAS.
            for (;; ia++, ib++)
            {
                char ca = charAt(a, ia);
                char cb = charAt(b, ib);

                if (!Character.isDigit(ca) && !Character.isDigit(cb))
                {
                    return bias;
                }
                else if (!Character.isDigit(ca))
                {
                    return -1;
                }
                else if (!Character.isDigit(cb))
                {
                    return +1;
                }
                else if (ca < cb)
                {
                    if (bias == 0)
                    {
                        bias = -1;
                    }
                }
                else if (ca > cb)
                {
                    if (bias == 0)
                        bias = +1;
                }
                else if (ca == 0 && cb == 0)
                {
                    return bias;
                }
            }
        }

    public int compare(File o1, File o2)
    {
        String a = o1.getName();
        String b = o2.getName();

        int ia = 0, ib = 0;
        int nza = 0, nzb = 0;
        char ca, cb;
        int result;

        while (true)
        {
            // only count the number of zeroes leading the last number compared
            nza = nzb = 0;

            ca = charAt(a, ia);
            cb = charAt(b, ib);

            // skip over leading spaces or zeros
            while (Character.isSpaceChar(ca) || ca == '0')
            {
                if (ca == '0')
                {
                    nza++;
                }
                else
                {
                    // only count consecutive zeroes
                    nza = 0;
                }

                ca = charAt(a, ++ia);
            }

            while (Character.isSpaceChar(cb) || cb == '0')
            {
                if (cb == '0')
                {
                    nzb++;
                }
                else
                {
                    // only count consecutive zeroes
                    nzb = 0;
                }

                cb = charAt(b, ++ib);
            }

            // process run of digits
            if (Character.isDigit(ca) && Character.isDigit(cb))
            {
                if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0)
                {
                    return result;
                }
            }

            if (ca == 0 && cb == 0)
            {
                // The strings compare the same. Perhaps the caller
                // will want to call strcmp to break the tie.
                return nza - nzb;
            }

            if (ca < cb)
            {
                return -1;
            }
            else if (ca > cb)
            {
                return +1;
            }

            ++ia;
            ++ib;
        }
    }

    static char charAt(String s, int i)
    {
        if (i >= s.length())
        {
            return 0;
        }
        else
        {
            return s.charAt(i);
        }
    }
}

Den Sortieralgo.. hab ich aus dem Netz: http://www.java2s.com/Code/Java/Collections-Data-Structure/NaturalOrderComparator.htm

Gruß
 
Zurück