内容可与字符串进行字母排序比较

问题描述 投票:6回答:4

我希望对象具有可比性(在这种情况下,可以在TreeSet中使用它。

我的对象有一个名称字段,我希望它按字母顺序排序。

[我首先想到我可以使用字符串的unicode值并简单地进行减法,但是例如,AA将在Ab后面…

这是我的开始方式:

public final class MyObject implements Comparable<MyObject> {

 private String name;

 public MyObject(String name) {
  this.name = name;
 }

 public String name() {
  return name;
 }

 @Override
 public int compareTo(MyObject otherObject) {
  return WHAT DO I PUT HERE ?;
 }
}

感谢那些会帮助您的人,祝你有美好的一天!

java interface comparable implements alphabetical-sort
4个回答
22
投票

您正在思考问题。 String有其自己的自然顺序,即字母顺序,因此您可以像这样使用String.compareTo

@Override
public int compareTo(MyObject otherObject) {
    return this.name.compareTo(otherObject.name);
}

4
投票
return name.compareTo(otherObject.name);

字符串已经实现了Comparable,因此您无需执行任何操作。


1
投票

我认为您想要这样的东西

package mine;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MyObject {
    private String name;

    public MyObject(String name) {
        this.name = name;
    }

    public MyObject() {
        // TODO Auto-generated constructor stub
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }



    @Override
    public String toString() {
        return "MyObject [name=" + name + "]";
    }

    public static void main(String[] args){
        List<MyObject> l = new ArrayList<>();
        l.add(new MyObject("Ab"));
        l.add(new MyObject("AA"));
        l.add(new MyObject());

        Collections.sort(l, new Comparator<MyObject>(){

            @Override
            public int compare(MyObject o1, MyObject o2) {
                if (o1.name == null && o2.name == null){
                    return 0;
                }else if (o1.name == null){
                    return -1;
                }else if (o2.name == null){ 
                    return 1;
                }else{
                    return o1.name.toUpperCase().compareTo(o2.name.toUpperCase());
                }
            }

        });

        System.out.println(l);
    }
}

0
投票

存在很多优先选择的方法。但是,为了保持更好的兼容性,性能以及避免运行时异常(例如NullPointerException),请使用最佳实践,即>

对于字符串

@Override
    public int compareTo(OtherObject o) {
        return String.CASE_INSENSITIVE_ORDER.compare(this.name,o.name);
    }

对于int,请使用double浮点数(以避免装箱和拆箱,这是比较器下的性能问题,]

// with functional expression
Comparator.compareInt, Comparator.compareDouble, Comparator.compareFloat


// or with static compare method
/**
*  Integer
*/
public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }

/**
*  Double
*/
public int compareTo(Double anotherDouble) {
        return Double.compare(value, anotherDouble.value);
    }

/**
*  Float
*/
public int compareTo(Float anotherFloat) {
        return Float.compare(value, anotherFloat.value);
    }

/**
*  Objects
*/
public int compareTo(Object other) {
        return Object.compare(value, other.value);
    }

[有效的Java项目14:考虑可比的工具]

最后,每当实现具有合理顺序的值类时,都应该让类实现Comparable接口,以便可以轻松地在基于比较的集合中对它的实例进行排序,搜索和使用。在compareTo方法的实现中比较字段值时,请避免使用运算符。相反,请使用带框原始类型中的静态比较方法或“比较器”界面中的比较器构造方法

© www.soinside.com 2019 - 2024. All rights reserved.