- PR -

Javaでのsort処理について

投稿者投稿内容
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-07-25 20:54
失礼しました。FileFilterではソートはできませんね。勘違いお許しください。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2005-07-27 11:12
引用:

vincentさんの書き込み (2005-07-25 17:36) より:
こんなんでどうでしょう。
(使う時はエラーチェック等足してください)

import java.io.*;
import java.util.*;

public class FileSorter {
  public static void main(String[] args) {

    File f = new File("/usr/bin");
    File[] files = f.listFiles();
    Arrays.sort(files, new LastModifiedComparator());

    //確認
    for (int i = 0; i < files.length; i++) {
      Date d = new Date(files[i].lastModified());
      System.out.println(d.toString() + " " + files[i].getName());
    }
  }
}
class LastModifiedComparator implements Comparator {

  public int compare(Object o1, Object o2) {
    File f1 = (File)o1;
    File f2 = (File)o2;
    return (new Long(f1.lastModified())).compareTo(new Long(f2.lastModified()));
  }

  public boolean equals(Object o1, Object o2) {
    File f1 = (File)o1;
    File f2 = (File)o2;
    return f1.lastModified() == f2.lastModified();
  }
}



LastModifiedComparator の equals メソッドは何のため?
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2005-07-27 14:14
要らないですね。
間違えました。すいません。

APIドキュメントの
public boolean equals(Object obj)
がちらっと目に入って、なんとなく書いてしまいました。
しかも引数間違っているし…恥ずかしい限りです。
beco
会議室デビュー日: 2005/02/24
投稿数: 6
投稿日時: 2005-07-27 16:32
お話に割り込みます。

私がよくやるソートはTreeMapを利用します。
綺麗なアルゴリズムになるかわかりませんが、
ソートキーにしたいもの(今回は最終更新時間)をマップのキーにして、
値をFileオブジェクトにすると、
Map#keySet()でキー値を取った時に最終更新時間の順で並びます。

File dir = new File("C:\temp");
File[] files = dir.listFiles();
TreeMap map = new TreeMap();
for (int i = 0; i < files.length; i++) {
// 最終更新日時をソートキーにしてマップに追加
map.put(String.valueOf(files[i].lastModified()), files[i]);
}
Iterator itr = map.keySet().iterator();
while (itr.hasNext()) {
File f = (File) itr.next();
System.out.println("名前: " + f.getName() + " 時間: " + f.lastModified());
}

最終更新日時はLong値なので
すべてのキー文字列の長さが同じになるように編集する必要はあります。

これよく使うんですけどどうでしょうかね?
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-07-27 17:17
引用:

becoさんの書き込み (2005-07-27 16:32) より:

ソートキーにしたいもの(今回は最終更新時間)をマップのキーにして、


その場合、重複するキーが発生する可能性がありますね。
beco
会議室デビュー日: 2005/02/24
投稿数: 6
投稿日時: 2005-07-27 17:38
引用:

Edossonさんの書き込み (2005-07-27 17:17) より:
引用:

becoさんの書き込み (2005-07-27 16:32) より:

ソートキーにしたいもの(今回は最終更新時間)をマップのキーにして、


その場合、重複するキーが発生する可能性がありますね。



重複する時には
 // 最終更新日時とファイル名をソートキーにしてマップに追加
 String key = files[i].lastModified()) + files[i].getName();
 map.put(key, files[i]);
のようにすると、最終更新日時+ファイル名の順でソートされます。
ソートキーの文字列の作成方法で
ソートする条件はは殆ど自由に設定できると思います。

[ メッセージ編集済み 編集者: beco 編集日時 2005-07-27 17:39 ]

[ メッセージ編集済み 編集者: beco 編集日時 2005-07-27 17:39 ]
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-07-27 18:07
引用:

重複する時には


重複を回避するためにはすべての重複可能性を判定する必要があります。
引用:

ソートする条件はは殆ど自由に設定できると思います。


そのためにComparatorとを使う仕組みが用意されているわけでして。
そもそも私は「どうでしょうか」とあったのでコメントしたまでですよ。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2005-07-27 18:24
ちょうど昨日同じことを調べてました。
Collection#sortの方法は他の方が書いているので、
ソートアルゴリズムの実装のほうについて書きます。

JDKの demo/applets/SortDemo のディレクトリに
バブルソートとクイックソートの実装例がありますよ。

スキルアップ/キャリアアップ(JOB@IT)