2
private class FileType extends Object {
    private String Name;
    private String Type;

    public FileType() {
        Name = null;
        Type = null;
    }

    public void setFileType(String n, String t) {
        Name = n;
        Type = t;
    }   

    public int compareTo(FileType ft) {
        String decodedFileName = null;
        String decodedInputName = null;
        try {
            decodedFileName = URLDecoder.decode(this.Name, "UTF-8");
            decodedInputName = URLDecoder.decode(ft.Name, "UTF-8");
        }
        catch(UnsupportedEncodingException e) {
        }
        return decodedFileName.compareToIgnoreCase(decodedInputName);
    }
}

上記のコードは、ファイル リストの定義クラスです。
ファイル名の比較を実装しました。
タイプはまたはの場合がありFolderますFile
しかし、ファイルをソートしたいのは、優先度がタイプで、次に優先度が名前です。
どのようにそれを到着することができます?

4

6 に答える 6

3

Comparable / compareTo メソッドを実装する必要があります。

于 2012-08-10T09:26:52.723 に答える
2

複数の方法で並べ替えるには、Comparator Interface fromjava.util packageを使用します......

compare(T t1, T t2)Comparator Egの方法を使用します。

サイトhttp://www.mkyong.comの例を次に示します。

import java.util.Comparator;

public class Fruit{

    private String fruitName;
    private String fruitDesc;
    private int quantity;

    public Fruit(String fruitName, String fruitDesc, int quantity) {
        super();
        this.fruitName = fruitName;
        this.fruitDesc = fruitDesc;
        this.quantity = quantity;
    }

    public String getFruitName() {
        return fruitName;
    }
    public void setFruitName(String fruitName) {
        this.fruitName = fruitName;
    }
    public String getFruitDesc() {
        return fruitDesc;
    }
    public void setFruitDesc(String fruitDesc) {
        this.fruitDesc = fruitDesc;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }



    public static Comparator<Fruit> FruitNameComparator 
                          = new Comparator<Fruit>() {

        public int compare(Fruit fruit1, Fruit fruit2) {

          String fruitName1 = fruit1.getFruitName().toUpperCase();
          String fruitName2 = fruit2.getFruitName().toUpperCase();

          //ascending order
          return fruitName1.compareTo(fruitName2);

          //descending order
          //return fruitName2.compareTo(fruitName1);
        }

    };
}
于 2012-08-10T09:27:09.747 に答える
2

両方のタイプを比較します。比較結果が 0 以外の場合は結果として返します。0 の場合、名前を比較します。

ご了承ください:

  • オブジェクトの拡張は不要です。これがデフォルトです
  • フィールドは小文字で始める必要があります: name, type na dnot Name, Type
  • あなたのクラスは実装する必要がありますComparable<FileType>
  • クラスには別の名前を選択します。これはファイル タイプではなく、ファイル タイプに関連付けられたファイル名です。
  • ファイルタイプの有効なインスタンスが2つしかないため、ファイルタイプには文字列ではなく列挙型を使用します
  • あなたがやっているように例外を無視するべきではありません。ところで、この例外が発生すると、NullPointerException が発生する可能性があります。例外を実行時例外にラップし、この実行時例外をスローします。

    catch(UnsupportedEncodingException e) {
        throw new RuntimeException(e);
    }
    
  • デフォルトのコンストラクターは名前に null を割り当てますが、compareTo メソッドは null 名を処理しません。メソッドまたはコンストラクターを修正してください。ファイル名が null であってはならないように思われるので、コンストラクターを修正します。
于 2012-08-10T09:28:23.397 に答える
1
if (this.Type.equals(ft.Type)){
  return decodedFileName.compareTo(decodedInputName);
}
else{
  return this.Type.compareTo(ft.Type);

}
于 2012-08-10T09:29:10.093 に答える
1

最初に型を比較し、次にデコードされた名前を比較します。URLDecoder.decode の呼び出しが多すぎるのを防ぐために、decodedFileName 値をクラスに直接キャッシュしました。

private class FileType extends Object implements Comparable<FileType>{
    private String name;
    private String decodedFileName;
    private String type;
    public FileType(String n, String t) {
        name = n;
        try {
            decodedFileName = URLDecoder.decode(this.name, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }           
        type = t;
    }
    public int compareTo(FileType other) {
        int result = type.compareToIgnoreCase(other.type);
        if (result == 0){
            result = decodedFileName.compareToIgnoreCase(other.decodedFileName);
        }
        return result;
    }
}
于 2012-08-10T09:31:34.943 に答える
1

タイプが 2 つしかない場合、それらを列挙型にしないのはなぜですか?
次に、最初に type.ordinal を比較し、等しい場合は名前を比較し、そこに不要な値を入れないようにします

于 2012-08-10T09:31:50.857 に答える