如何实现排序类

时间:2012-08-10 09:20:57

标签: java

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 怎么能到达它?

6 个答案:

答案 0 :(得分:3)

您必须实现Comparable / compareTo方法。

答案 1 :(得分:2)

使用Comparator的{​​{1}}界面与以多种方式排序......

使用比较器的java.util package方法 的例如

以下是网站 http://www.mkyong.com

的示例
compare(T t1, T t2)

答案 2 :(得分:2)

比较两种类型。如果比较与0不同,则返回结果。如果等于0,则比较名称。

请注意:

  • 不需要扩展对象:这是默认的
  • 字段应以小写字母开头:name,type na dnot Name,Type
  • 您的班级应该实施Comparable<FileType>
  • 我会为该类选择另一个名称:它不是文件类型,而是与文件类型关联的文件名
  • 我会使用enum而不是String来表示文件类型,因为你只有两个有效的文件类型实例
  • 你永远不应该忽视你正在做的异常。顺便说一句,如果发生此异常,可能会导致NullPointerException。将异常包装到运行时异常中并抛出此运行时异常:

    catch(UnsupportedEncodingException e) {
        throw new RuntimeException(e);
    }
    
  • 您的compareTo方法不处理空名称,但默认构造函数会为名称指定null。修复方法或构造函数。在我看来,文件名永远不应该为null,所以我会修复构造函数。

答案 3 :(得分:1)

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

}

答案 4 :(得分: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;
    }
}

答案 5 :(得分:1)

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