Frage

Mein Problem ist tatsächlich differenzierter als die Frage schon sagt, wollte aber den Header kurz halten.

Ich habe eine HashMap<String, File> von File Objekte als Werte. Die Tasten sind String name Felder, die in den File Instanzen sind. Ich brauche die Werte in der HashMap iterieren und sie als einen einzigen String zurückzukehren.

Das ist, was ich habe zur Zeit:

private String getFiles()
{   
    Collection<File> fileCollection = files.values();
    StringBuilder allFilesString = new StringBuilder();

    for(File file : fileCollection) {
        allFilesString.append(file.toString());
    }
    return allFilesString.toString();
}

Dies hat den Zweck erfüllt, sondern im Idealfall möchte ich die einzelnen File Werte an die StringBuilder in der Reihenfolge des int fileID, die ein Feld der File Klasse angehängt werden.

Hope Ich habe das klar genug gemacht.

War es hilfreich?

Lösung

So etwas sollte funktionieren:

List<File> fileCollection = new ArrayList<File>(files.values());

Collections.sort(fileCollection, 
                 new Comparator<File>() 
                 {
                     public int compare(File fileA, File fileB) 
                     {
                         final int retVal;

                         if(fileA.fileID > fileB.fileID)
                         {
                             retVal = 1;
                         }
                         else if(fileA.fileID < fileB.fileID)
                         {
                             retVal = -1;
                         }
                         else
                         {
                             retVal = 0;
                         }

                         return (retVal);                         
                     }
                 });

Andere Tipps

Leider gibt es keine Möglichkeit, Daten zu bekommen aus einem HashMap in erkennbarer Reihenfolge. Sie müssen entweder alle Werte in einen TreeSet mit einem Vergleicher setzen, der die fileID verwendet, oder sie in eine Arraylist setzen und sortieren sie mit Collections.sort, wieder mit einem Komparator, der die Art und Weise vergleichen Sie wollen.

Die TreeSet Methode funktioniert nicht, wenn es irgendwelche Duplikate sind, und es kann zu viel des Guten, da du gehst werden die Dinge nicht oder Entfernen Dinge aus dem Set hinzufügen. Die Collections.sort Methode ist eine gute Lösung für Fälle wie diesen, wo man die ganze HashSet nehmen gehen, um die Ergebnisse zu sortieren, und dann die sortierte Sammlung werfen weg, sobald Sie das Ergebnis generiert haben.

OK, das ist, was ich habe kommen mit. Es scheint, das Problem zu lösen, Retouren durch ihren fileId gut bestellt ein String mit dem Dateiobjekt.

public String getFiles()
{   
    List<File> fileList = new ArrayList<File>(files.values());

    Collections.sort(fileList, new Comparator<File>()
                               {
                                   public int compare(File fileA, File fileB)
                                   {
                                       if(fileA.getFileId() > fileB.getFileId()) 
                                       {
                                           return 1;
                                       }
                                       else if(fileA.getFileId() < fileB.getFileId()) 
                                       {
                                           return -1;
                                       }
                                       return 0;
                                   }
                               });

    StringBuilder allFilesString = new StringBuilder();

    for(File file : fileList) {
        allFilesString.append(file.toString());
    }
    return allFilesString.toString();
}

Ich habe noch nie Vergleicher vor (relativ neu in Java) verwendet wird, würde jedes Feedback so schätzen, wenn ich etwas falsch implementiert haben.

Warum es nicht in einem Array sammeln, sortieren, dann verketten es?

- MarkusQ

Sie werden Ihre Werte () Collection zu einem Arraylist muss hinzufügen und sortieren es Collections.sort () mit einem benutzerdefinierten Vergleicher Instanz verwenden, bevor über sie iterieren.

BTW, beachten Sie, dass es sinnlos ist, den String mit der Größe der Sammlung zu initialisieren, da Sie weit mehr als 1 Zeichen pro Sammelelement würden hinzugefügt wird.

Erstellen Sie eine temporäre Liste, dann jedes Paar von Daten in hinzufügen. Sortieren Sie es mit Collections.sort () entsprechend Ihrer benutzerdefinierten Komparator dann werden Sie die Liste in der gewünschten Reihenfolge haben.

Hier ist die Methode, die Sie suchen: http://java.sun.com/javase/6/docs/api/java/util/Collections.html#sort (java.util.List ,% 20java.util.Comparator)

Ich habe LinkedHashMap ein Dutzend Mal, bevor es zu dem Satz von Sammlungen hinzugefügt wurde.

Was möchten Sie wahrscheinlich zu tun ist, eine TreeHashMap Sammlung erstellen.

eine zweite Sammlung erstellen und etwas zu beiden hinzugefügt Anhängen ist nicht wirklich eine Größe Hit, und Sie erhalten die Leistung von beiden (mit den Kosten für ein wenig Zeit, wenn Sie hinzufügen).

Ihr es als eine neue Kollektion Code Aufenthalt sauber und ordentlich hilft. Die Sammlung Klasse sollte nur ein paar Zeilen lang sein und sollte nur ersetzen Ihre bestehende hashmap ...

Wenn Sie die Gewohnheit, immer Einwickeln Ihre Sammlungen zu erhalten, dieses Zeug funktioniert einfach, Sie noch nie davon denken.

StringBuffer allFilesString = new StringBuffer(fileCollection.size());

Es sei denn, alle Ihre file.toString () ist ein Zeichen im Durchschnitt, sind Sie wahrscheinlich den String machen zu klein. (Wenn es nicht richtig, man kann auch nicht festgelegt, und der Code einfacher machen) Sie bessere Ergebnisse erzielen können, wenn Sie es ein Vielfaches der Größe. Zusätzlich ist String synchronisiert, aber Stringbuilder ist nicht und es für eine effizientere hier.

Entfernen Sie unnötige if statment.

List<File> fileCollection = new ArrayList<File>(files.values());
Collections.sort(fileCollection, 
             new Comparator<File>() {
                 public int compare(File a, File b) {
                     return (a.fileID - b.fileID);
                 }
             });
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top