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
但是我要对文件进行排序,第一优先是类型,第二优先是名称。
怎么可能到达呢?

4

6 回答 6

3

您必须实现 Comparable / compareTo 方法。

于 2012-08-10T09:26:52.723 回答
2

使用Comparator接口 fromjava.util package不止一种方式进行排序......

使用compare(T t1, T t2)Comparator 的方法, 例如:

这是来自网站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>
  • 我会为该类选择另一个名称:它不是文件类型,而是与文件类型关联的文件名
  • 我会为文件类型使用枚举而不是字符串,因为您只有两个有效的文件类型实例
  • 你永远不应该像你正在做的那样忽略异常。顺便说一句,如果发生此异常,可能会导致 NullPointerException。将异常包装成运行时异常并抛出此运行时异常:

    catch(UnsupportedEncodingException e) {
        throw new RuntimeException(e);
    }
    
  • 您的 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

您首先比较类型,然后比较解码的名称。我直接在类中缓存了decodedFileName的值,防止调用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;
    }
}
于 2012-08-10T09:31:34.943 回答
1

如果你只有两种类型,为什么不让它们枚举?
然后首先比较 type.ordinal,如果相等则比较名称,并防止将不需要的值放在那里

于 2012-08-10T09:31:50.857 回答