0

私の問題は、実際には質問が示唆するよりも微妙ですが、ヘッダーを簡潔にしたかったのです。

HashMap<String, File>値としての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値を追加したいと考えています。StringBuilderint fileIDFile

私がそれを十分に明確にしたことを願っています。

4

9 に答える 9

6

このようなものが動作するはずです:

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);                         
                     }
                 });
于 2009-03-02T20:14:26.090 に答える
4

残念ながら、認識可能な順序で HashMap からデータを取得する方法はありません。fileID を使用する Comparator を使用してすべての値を TreeSet に入れるか、それらを ArrayList に入れて Collections.sort でソートし、必要な方法で比較する Comparator を使用する必要があります。

重複がある場合、TreeSet メソッドは機能しません。また、Set に何かを追加したり、Set から何かを削除したりするつもりはないので、やり過ぎかもしれません。Collections.sort メソッドは、HashSet 全体を取得して結果を並べ替え、結果が生成されたらすぐに並べ替えられたコレクションを破棄するような場合に適したソリューションです。

于 2009-03-02T20:05:50.607 に答える
1

わかりました、これが私が思いついたものです。問題を解決しているようで、fileId で適切に並べられた File オブジェクトを含む文字列を返します。

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 は比較的新しい) ため、何か間違って実装した場合はフィードバックをいただければ幸いです。

于 2009-03-04T23:55:29.430 に答える
0
StringBuffer allFilesString = new StringBuffer(fileCollection.size());

すべてのfile.toString()が平均して1文字でない限り、StringBufferを小さくしすぎている可能性があります。(正しくない場合は、設定せずにコードを単純化することをお勧めします)サイズの倍数にすると、より良い結果が得られる可能性があります。さらに、StringBufferは同期されますが、StringBuilderは同期されていないため、ここでより効率的になります。

于 2009-03-04T07:04:31.340 に答える
0

values() Collection を ArrayList に追加し、 Collections.sort() を使用してカスタム Comparator インスタンスで並べ替えてから、それを反復処理する必要があります。

ところで、StringBuffer をコレクションのサイズで初期化するのは無意味であることに注意してください。これは、コレクション要素ごとに 1 文字をはるかに超える文字を追加することになるためです。

于 2009-03-02T20:10:00.253 に答える
0

一時的なリストを作成し、データの各ペアをそれに追加します。カスタムコンパレーターに従って Collections.sort() でソートすると、リストが希望の順序になります。

探しているメソッドは次のとおりです: http://java.sun.com/javase/6/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator )

于 2009-03-02T20:10:21.030 に答える
0

コレクションのセットに追加される前に、LinkedHashMap を何十回も作成しました。

おそらくやりたいことは、TreeHashMap コレクションを作成することです。

2 番目のコレクションを作成し、両方に何かを追加することは、実際にはサイズ ヒットではなく、両方のパフォーマンスを得ることができます (追加時に少し時間がかかります)。

これを新しいコレクションとして行うことで、コードをクリーンで整然とした状態に保つことができます。コレクションクラスは数行の長さで、既存のハッシュマップを置き換えるだけです...

常にコレクションをラップする習慣を身につければ、このようなことはうまく機能し、考えることさえありません。

于 2009-03-02T20:47:17.137 に答える
0

それを配列に集めて、並べ替えてから、連結してみませんか?

-- マーカスQ

于 2009-03-02T20:06:45.220 に答える
0

不要なifステートメントを削除します。

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);
                 }
             });
于 2009-03-12T00:59:41.620 に答える