簡體   English   中英

如何形成從HashMap提取的值的有序列表?

[英]How can I form an ordered list of values extracted from HashMap?

我的問題實際上比問題所建議的更加細微,但希望保持標題簡短。

我有File對象的HashMap<String, File>作為值。 鍵是String name字段,它們是File實例的一部分。 我需要遍歷HashMap的值,並將它們作為單個String返回。

這是我目前擁有的:

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

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

這可以完成工作,但是理想情況下,我希望將單獨的File值按int fileID順序附加到StringBuilder ,這是File類的一個字段。

希望我已經說得足夠清楚了。

這樣的事情應該起作用:

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

不幸的是,無法以任何可識別的順序從HashMap中獲取數據。 您必須將所有值放入帶有使用fileID的Comparator的TreeSet中,或者將它們放入ArrayList並使用Collections.sort對其進行排序,再使用Comparator將它們進行比較,以比較所需的方式。

如果有重復項,則TreeSet方法將不起作用,並且由於您不會在Set中添加內容或從Set中刪除內容,因此可能會過大。 對於這樣的實例,Collections.sort方法是一個很好的解決方案,在這種情況下,您將對整個HashSet進行處理,對結果進行排序,然后在生成結果后立即將排序后的集合扔掉。

好的,這就是我想出的。 似乎要解決此問題,返回一個String,其File對象按其fileId很好地排序。

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

我以前從未使用過Comparator(對Java而言是相對較新的),因此,如果我實施不正確,則將不勝感激。

為什么不將其收集在一個數組中,對其進行排序然后將其連接起來呢?

-MarkusQ

您必須在迭代之前將values()集合添加到ArrayList並使用Collections.sort()和自定義Comparator實例對其進行排序。

順便說一句,請注意,使用集合的大小初始化StringBuffer是沒有意義的,因為您將為每個集合元素添加遠遠超過1個字符。

創建一個臨時列表,然后將每對數據添加到其中。 根據您的自定義比較器,使用Collections.sort()對它進行排序,然后按所需順序排列列表。

這是您要查找的方法: http : //java.sun.com/javase/6/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator )

在將LinkedHashMap添加到集合集之前,我創建了12次。

您可能想要做的是創建一個TreeHashMap集合。

創建第二個集合並添加添加到這兩個集合中的內容實際上並沒有帶來很大的成功,並且您可以同時獲得兩者的性能(添加時花費一點時間)。

作為一個新集合來做,可以幫助您的代碼保持整潔。 集合類應該只有幾行長,並且應該只替換現有的哈希圖...

如果您習慣於總是打包您的收藏,那么這些東西就行了,您甚至都不會想到它。

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

除非您所有的file.toString()平均都只有一個字符,否則可能會使StringBuffer太小。 (如果不正確,則最好不要設置它並使代碼更簡單)。如果將其設置為大小的倍數,則可能會得到更好的結果。 此外,StringBuffer是同步的,但StringBuilder不在此處,因此效率更高。

刪除不必要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);
                 }
             });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM