首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java比较器按多个字段排序

java比较器按多个字段排序
EN

Stack Overflow用户
提问于 2018-08-09 04:48:53
回答 1查看 141关注 0票数 -1

需要按3个字符串字段对类目录进行排序。第一个:按1值排序-s1;然后按字符串长度排序-在按2值排序-s2之后排序;按3值排序- s3。在我的代码中,它适用于值1和字符串长度排序,但按2值排序不起作用。如何通过多个值对class Dir进行排序?类目录:

代码语言:javascript
运行
复制
    public class Dir {

    private String s1 = "";
    private String s2 = "";
    private String s3 = "";

    public Dir(String s1){
        this.s1 = s1;
    }

    public Dir(String s1, String s2){
        this.s1 = s1;
        this.s2 = s2;
    }

    public Dir(String s1, String s2, String s3){
        this.s1 = s1;
        this.s2 = s2;
        this.s3 = s3;
    }

    public String getS1() {
        return s1;
    }

    public void setS1(String s1) {
        this.s1 = s1;
    }

    public String getS2() {
        return s2;
    }

    public void setS2(String s2) {
        this.s2 = s2;
    }

    public String getS3() {
        return s3;
    }

    public void setS3(String s3) {
        this.s3 = s3;
    }

    @Override
    public String toString() {
        return s1 + "\\" + s2 +"\\"+ s3 ;
    }
}





    //Comparator for 2 value:
    public class DirReversComparatorS2 implements Comparator<Dir> {
    @Override
    public int compare(Dir o1, Dir o2) {

        if ((o1.getS2().compareTo(o2.getS2())) > 0) {
            return -1;
        }
        else if ((o1.getS2().compareTo(o2.getS2())) < 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

//Comparator for 3 value
public class DirReversComparatorS3 implements Comparator<Dir> {
@Override
public int compare(Dir o1, Dir o2) {


    if ((o1.getS3().compareTo(o2.getS3())) > 0) {
        return -1;
    } else if ((o1.getS3().compareTo(o2.getS3())) < 0) {
        return 1;
    }
    else {
        return 0;
    }
}

}

代码语言:javascript
运行
复制
//Comparator for string lenght:

public class DirReversStringComparator implements Comparator<Dir> {
@Override
public int compare(Dir o1, Dir o2) {
    if (o1.toString().length() > o2.toString().length()) {
        return 1;
    }
    else {
        return -1;
    }

}

}

代码语言:javascript
运行
复制
    //Main class:
    public class Main {
    public static void main(String[] args){

        Comparator<Dir> dcomp = new DirComparatorS1().thenComparing(new DirComparatorS2(
        ).thenComparing(new DirComparatorS3()));
        TreeSet<Dir> dir = new TreeSet<>(dcomp);
        dir.add(new Dir("K1"));
        dir.add(new Dir("K1","SK2"));
        dir.add(new Dir("K1","SK1","SSK2"));
        dir.add(new Dir("K1", "SK1", "SSK1"));
        dir.add(new Dir("K2"));
        dir.add(new Dir("K2", "SK2", "SSK1"));
        dir.add(new Dir("K2", "SK2", "SSK2"));
        dir.add(new Dir("K2", "SK3", "SSK2"));
        dir.add(new Dir("K2", "SK2", "SSK3"));



        System.out.println("Отсортирован по возрастанию");
        for(Dir d : dir){
            System.out.println(d.getS1()+"\\"+d.getS2()+"\\"+d.getS3());
        }


        //This code does not works!
        Comparator<Dir> reverse = new DirReversComparatorS1().thenComparing(
                new DirReversStringComparator()).thenComparing(
                        new DirReversComparatorS2()).thenComparing(
                                new DirReversComparatorS3());


        TreeSet<Dir> rdir = new TreeSet<>(reverse);
        rdir.add(new Dir("K1"));
        rdir.add(new Dir("K1","SK2"));
        rdir.add(new Dir("K2","SK2"));
        rdir.add(new Dir("K1","SK1","SSK2"));
        rdir.add(new Dir("K1", "SK1", "SSK1"));
        rdir.add(new Dir("K1", "SK1", "SSK2"));
        rdir.add(new Dir("K2"));
        rdir.add(new Dir("K2", "SK4", "SSK3"));
        rdir.add(new Dir("K2", "SK2", "SSK5"));
        rdir.add(new Dir("K2","SK1"));
        rdir.add(new Dir("K2", "SK2", "SSK1"));
        rdir.add(new Dir("K1", "SK1"));
        rdir.add(new Dir("K2", "SK2", "SSK2"));
        rdir.add(new Dir("K1", "SK2"));
        rdir.add(new Dir("K2", "SK3", "SSK2"));
        rdir.add(new Dir("K2", "SK2", "SSK3"));
        rdir.add(new Dir("K2", "SK2", "SSK5"));
        rdir.add(new Dir("K2", "SK1", "SSK3"));
        rdir.add(new Dir("K1", "SK3"));
        rdir.add(new Dir("K1", "SK3", "SSK1"));


        System.out.println("Отсортирован по убыванию");
        for(Dir d : rdir){
            System.out.println(d.getS1()+"\\"+d.getS2()+"\\"+d.getS3());
        }
    }
}

解决方案是什么?Tnx!

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

https://stackoverflow.com/questions/51755425

复制
相关文章

相似问题

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