比较器<file>实现错误

时间:2016-04-20 04:41:57

标签: java comparator

我的应用程序比较文件名和一个用户得到的比较方法违反了它的一般合同java&#34;。但我无法重现错误。

我的问题:没问题,当我的@Override compare()方法返回0时,这意味着对象是等于?

这是我的代码:

两种类型的排序:1)按上次修改日期2)按文件名中的正则表达式数字。

public class FileComparator implements Comparator<File> {
    int sortType;

    public FileComparator(int sortType) {
        this.sortType = sortType;
    }

    @Override
    public int compare(File f1, File f2) {
        int result;
        try {
            switch (sortType) {
                case Constants.SORT_BY_DATE:
                    result = f1.lastModified() > f2.lastModified() ? 1 : -1;
                    break;
                case Constants.SORT_BY_DIGID:
                    result = checkByDigit(f1, f2);
                    break;
                default:
                    result = f1.lastModified() > f2.lastModified() ? 1 : -1;
                    break;
            }
            return result;
        } catch (Exception e) {
            return 0;
        }
    }


    private static int checkByDigit(File f1, File f2) {
        String regEx;
        Pattern p;
        Matcher m1;
        Matcher m2;

        try {
            String f1Name = f1.getName().toUpperCase();
            String f2Name = f2.getName().toUpperCase();

            //  "ScanImage  _ 001"
            regEx = "(SCANIMAGE)(\\D*)(\\d+)";
            p = Pattern.compile(regEx);
            m1 = p.matcher(f1Name);
            m2 = p.matcher(f2Name);
            if (m1.find() && m2.find()) {
                return Integer.parseInt(m1.group(3)) > Integer.parseInt(m2.group(3)) ? 1 : -1;
            }

            //  "No_digits_here_001",""No_digits_here_002"
            regEx = "(\\D+)(\\d+)";
            p = Pattern.compile(regEx);
            m1 = p.matcher(f1Name);
            m2 = p.matcher(f2Name);
            if (m1.find() && m2.find()) {
                return Integer.parseInt(m1.group(2)) > Integer.parseInt(m2.group(2)) ? 1 : -1;
            }

            // We didnt find any digit, use lexicographically compare
            return f1.compareTo(f2);

        } catch (Exception e) {
            //
        }
        return 0;
    }
}

2 个答案:

答案 0 :(得分:0)

在这种特定情况下,您会遇到比较aaa_002ccc_001bbb等名称的问题。您的代码并没有真正决定正确的顺序。一种选择是对那些不包含数字序列的文件进行排序。

boolean m1find = m1.find();
boolean m2find = m2.find();

if(m1find || m2find) {
    if (m1find && m2find) {
            return Integer.compare(Integer.parseInt(m1.group(3)) > Integer.parseInt(m2.group(3)));
    } else {
            return Boolean.compare(m1find, m2find);
    }        
}

问题也可能是在排序过程中改变的lastModified时间,但它不太可能经常发生。

答案 1 :(得分:0)

当您对上次修改排序时,参数的顺序很重要,特别是当最后一次修改时是同一时间。使用Long#compare