实现Comparable以使用字符串进行字母排序

时间:2014-04-04 19:33:26

标签: java interface comparable implements alphabetical-sort

我希望一个对象可以比较(在这种情况下在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 ?;
 }
}

感谢那些愿意帮助的人, 祝你有愉快的一天!

4 个答案:

答案 0 :(得分:20)

你正在过度思考这个问题。 String有自己的自然顺序,这是字母的,所以你可以像这样使用String.compareTo

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

答案 1 :(得分:4)

return name.compareTo(otherObject.name);

String已经实现了Comparable,所以你不需要做任何事情。

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

存在许多首选方法。但是为了保持更好的兼容性,性能并避免运行时异常(例如NullPointerException),请使用

的最佳做法。

对于字符串

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

对于int,请使用双精度浮点数(以避免装箱和拆箱,这些装箱和装箱会在比较器下使用,以提高性能)

// 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方法的实现中比较字段值时,请避免使用<和>运算符。相反,请使用盒装基元类中的静态比较方法或Comparator接口中的比较器构造方法