Java程序实现对象的字母数字排序

3

Java程序以字母数字方式对对象进行排序

请告诉我如何获得期望的结果

期望输出: B2 D1 D2 D14 E2

实际输出: B2 D1 D14 D2 E2

====================================

List<Name> lst = new ArrayList<>();
lst.add(new Name("D",1));
lst.add(new Name("D",14));
lst.add(new Name("D",2));
lst.add(new Name("E",2));
lst.add(new Name("B",2));

Collections.sort(lst, new Comparator<Name>() {

    @Override
    public int compare(Name n1, Name n2) {
        // TODO Auto-generated method stub
        String o1=n1.getNm()+n1.getSeatnum();
        String o2=n2.getNm()+n2.getSeatnum();


         return o1.compareTo(o2);

    }
});

for (Name name : lst) {
    System.out.println(name.getNm()+name.getSeatnum());
}

=================================

public class Name {

    private String nm;
    private int seatnum;

    public int getSeatnum() {
        return seatnum;
    }

    public void setSeatnum(int seatnum) {
        this.seatnum = seatnum;
    }

    public Name(String nm) {
        super();
        this.nm = nm;
    }

    public Name(String nm, int seatnum) {
        super();
        this.nm = nm;
        this.seatnum = seatnum;
    }

    public String getNm() {
        return nm;
    }

    public void setNm(String nm) {
        this.nm = nm;
    }

}
3个回答

4

是的,这是可能的,但您的compare函数需要先检查String部分是否相等,然后使用数字比较来比较数字部分(目前两者都是按字典序比较)。因此,您可以使用类似以下的内容 -

public int compare(Name n1, Name n2) {
    int c = n1.getNm().compareTo(n2.getNm());
    if (c != 0) {
        return c;
    }
    return Integer.valueOf(n1.getSeatnum()).compareTo(n2.getSeatnum());
}

或者在Java 8+中使用 Comparator.comparing(Function)Comparator.thenComparing(Function),例如:

public int compare(Name n1, Name n2) {
    return Comparator.comparing(Name::getNm).thenComparing(Name::getSeatnum)
            .compare(n1, n2);
}

1

只需比较字母,然后再比较整数:

public int compare(Name n1, Name n2) {
    // TODO Auto-generated method stub
    int compare = n1.getNm().compareTo(n2.getNm());
    if (compare == 0) {
        return Integer.compare(n1.getSeatnum(), n2.getSeatnum());
    } else {
        return compare;
    }
}

0

你可以重写你的比较器,让它分为两步:

Collections.sort(lst, new Comparator<Name>() {
    @Override
    public int compare(Name n1, Name n2) {
        // compare the name part
        int nameCompare = n1.getName().compareTo(n2.getName());
        if(nameCompare != 0)
            return nameCompare;
        // compare the number part
        return n1.getSeatnum() - n2.getSeatnum();
    }
});

如果你想要注意 null 值,你应该添加:

Collections.sort(lst, new Comparator<Name>() {
    @Override
    public int compare(Name n1, Name n2) {
        // check for null Name
        if(n1 == null && n2 == null)
            return 0;
        else if(n1 == null)
            return -1;
        else if(n2 == null)
            return 1;

        // check for null in nx.getName()
        if(n1.getName() == null && n2.getName() == null)
            return 0;
        else if(n1.getName() == null)
            return -1;
        else if(n2.getName() == null)
            return 1;

        // compare the name part
        int nameCompare = n1.getName().compareTo(n2.getName());
        if(nameCompare != 0)
            return nameCompare;

        // compare the number part
        return n1.getSeatnum() - n2.getSeatnum();
    }
});

这种方法将把null值放在列表的开头。如果你喜欢把它们放在列表末尾,只需交换1-1
如果您还想不区分大小写,请修改名称比较行为:
        int nameCompare = n1.getName().toLowerCase().compareTo(n2.getName().toLowerCase());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接