3

私と同じような質問がたくさんあることは知っていますが、それらの答えはどこにもありません(何かが欠けているように感じます...)しかし、とにかく:

私は LinkedList を持っています。私のプログラムでは、ユーザーはファイルの最終変更時刻に従ってリストをソートできるはずです。

たとえば、これら2つに従って何かを実装しようとしました:ファイルの長いリストで最近変更された3つのファイルを検索し、最後に変更されたディレクトリでファイルを取得しますか? 私のプログラムでは、とにかくリストがソートされていないようです。

最初のリンクの場合: 1、-1、または 0 を返すこととは何ですか? それは実際に何かをしますか、それともリストの上または下に移動するコードを追加する必要がありますか?

どちらかを使うべきだと思いますよね?そのコードで十分なのか、それとも機能させるために何かを追加する必要があるのか​​ 疑問に思っていましたか?

注意。既存のクラスに新しいメソッドを作成したいと思います。

だからここに私がやろうとしたことがあります:

public static final Comparator<File> lastModified = new Comparator<File>() {
    @Override
    public int compare(File o1, File o2) {
        return o1.lastModified() == o2.lastModified() ? 0 : (o1.lastModified() < o2.lastModified() ? 1 : -1);
    }
};
public void testFileSort()  {

    File[] file = new File(".").listFiles();
    Arrays.sort(file, lastModified);
    //a snippet to actually update what the user sees
}

編集 私の最大の問題(おそらく?)は、私のメソッドが完了すると、ビューが更新されますが、正しい方法ではありません.「古い」リストは同じですが、一番下にあるべきではないものがあります.なれ... :

  • ファイル1.jpg
  • ファイル2.jpg
  • ..
  • ..
  • ..
  • 画像リスト.txt
  • 置き場
  • ソース
  • 設定
  • 事業
  • クラスパス

(imagelist.txt は、イメージパスが保存されているテキストファイルです)、何らかの理由で、ビューを更新した後に表示されるリストです。

EDIT 2 File[] file = new File(".").listFiles();

出力: [Ljava.io.File;@3e2a9a49 だから、これは実際の問題だと思います...? 私がやろうとしていたのは、LinkedList からこの配列にファイルを配置することでしたが、何か間違ったことをしたと思います。最初のリンクからこのスニペットを取得しました...これがどこかにある場合、これを行う適切な方法は何でしょうか正しい道の近く。

前もってありがとう、私の質問がある程度理にかなっており、皆さんが私をあまり判断しないことを願っています:)私はこれをかなり混乱させたことを知っています...

4

4 に答える 4

3

最初のリンクのコードは、ファイル配列の代わりにリンク リストを使用するだけで十分です。実際には、比較はコンパレーター内で行われています。コンパレータをジェネリックにするには、次の要素が大きいか小さいか等しいかを知るだけで済みます。要素自体の詳細を知る必要はありません。したがって、コンパレータ関数では、ロジックを処理し (最終変更時刻が早いかどうか)、それに基づいてコンパレータロジックに 1、-1、または 0 で情報を送信し、それが大きい、小さい、または等しいことを知らせます。比較対象の要素に。これが理にかなっていることを願っています。

于 2013-05-16T08:37:38.083 に答える
1

出力: [Ljava.io.File;@3e2a9a49 だから、これは実際の問題だと思います...?

疑わしい!

次のような出力は、単に配列[Ljava.io.File;@3e2a9a49を呼び出した結果を出力しようとしたことを意味します。toString()


最初のリンクの場合: 1、-1、または 0 を返すこととは何ですか? それは実際に何かをしますか、それともリストの上または下に移動するコードを追加する必要がありますか?

-1、0、+1 のポイントは、最初の引数が 2 番目の引数よりも「小さい」か「等しい」か「より大きい」かをソート アルゴリズムに伝えることです。詳細については、Comparatorインターフェースの javadoc を参照してください。

いいえ、並べ替え中に要素を移動しないでください。配列のソート中にそれを行うと、結果は予測できなくなります。


私を困惑させているのは、最後にそれらのファイルが存在すべきではないとあなたが考える理由です。ディレクトリ内のファイルをソートしています。それらのファイルがディレクトリにある場合、明らかにそれらはソートされた配列にあるはずであり、したがってビューにあるはずです。それらがディレクトリにない場合、最も可能性の高い問題はビューを更新するコードです...あなたが示したコードではありません。

于 2013-05-16T09:30:14.323 に答える
1

file.lastModified()を返すメソッドがありますlong。これに応じて、カスタム コンパレータを作成できます。
お気に入り:

       @Override
        public int compare(File o1, File o2) {
            return o1.lastModified() > o2.lastModified() ? 1 : 0;
        }
于 2013-05-16T08:40:34.543 に答える
0

オブジェクトとの比較時に返される整数値は{1, -1, 0}、比較対象のオブジェクトよりも大きい、小さい、等しいことを意味します。それ自体は何もしませんが、一方が他方よりも大きいか、小さいか、または等しいかはわかります。

于 2013-05-16T08:37:54.373 に答える