首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Comparator<File>实现错误

Comparator<File>实现错误
EN

Stack Overflow用户
提问于 2016-04-20 12:41:57
回答 2查看 100关注 0票数 0

我的应用程序比较了文件名,一个用户得到了“比较方法违反了它的通用java合同”。但我不能重现错误。

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

这是我的代码:

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

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-04-20 14:43:38

在这种特定情况下,您在比较aaa_002ccc_001bbb等名称时会遇到问题。您的代码并不能真正决定正确的顺序。一种选择是将所有包含数字序列的文件排在不包含数字序列的文件之后。

代码语言:javascript
复制
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时间的改变,但它不太可能经常发生。

票数 0
EN

Stack Overflow用户

发布于 2016-04-20 14:50:48

当您对上次修改的时间进行排序时,参数的顺序很重要,特别是在上次修改的时间相同的情况下。使用Long#compare

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36733974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档