2012-08-10 89 views
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); 
    } 
} 

上面的代碼是我定義文件列表的類。
我已經實現了比較文件名。
該類型可能爲FolderFile
但我想排序文件的第一個優先級是Type,第二個優先級是Name。
如何才能到達它?如何實現排序類

+5

的防止'延伸Object'是多餘的,防止合法的傳承。 – adarshr 2012-08-10 09:23:27

+1

我認爲你應該實現可比的界面。爲什麼擴展對象是隱式需要的? – 2012-08-10 09:24:13

+0

這是功課嗎? – Elchin 2012-08-10 09:25:35

回答

1
if (this.Type.equals(ft.Type)){ 
    return decodedFileName.compareTo(decodedInputName); 
} 
else{ 
    return this.Type.compareTo(ft.Type); 

} 
3

你必須實現Comparable/compareTo方法。

2

使用Comparator接口從java.util package排序的方式不止一種......

用比較的方法compare(T t1, T t2) 如:

下面是來自現場的例子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); 
     } 

    }; 
} 
2

比較兩種類型。如果比較結果與0不同,則返回結果。如果等於0,則比較名稱。

需要注意的是:

  • 擴展對象是不必要的:它是默認
  • 字段應該以小寫字母開頭:名稱,類型吶dnot名稱,類型
  • 你的類應該實現Comparable<FileType>
  • 我會爲這個類別選擇另一個名稱:它不是文件類型,而是與文件類型關聯的文件名
  • 我將使用枚舉而不是字符串作爲文件類型,因爲你只有兩個有效的文件類型實例
  • 你永遠不應該忽略你正在做的異常。順便說一句,如果發生這種異常,它可能會導致NullPointerException。包裝該異常進入運行異常,並拋出此運行時異常:

    catch(UnsupportedEncodingException e) { 
        throw new RuntimeException(e); 
    } 
    
  • 你compareTo方法不處理空的名字,雖然默認的構造函數賦值爲null的名稱。修復方法或構造函數。在我看來,文件名不應該爲空,所以我會修復構造函數。
1

您首先比較類型和解碼名稱。 我直接在類中緩存decodeFileName值以防止調用URLDecoder.decode過多。

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

如果你只有兩種類型,爲什麼不讓它們枚舉?
那麼首先你比較type.ordinal,如果有相等,則比較名稱, ,也從投入不需要的值有