使用Comparable实现字符串的字母顺序排序。

11

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

感谢那些愿意提供帮助的人,祝你拥有美好的一天!


3
提示:String 实现了 Comparable<String> 接口... - ppeterka
1
我已经从标题中删除了语言信息,对于你的下一个问题,请使用标签来指定所使用的编程语言,而不是在标题中体现。 - Marco Acierno
4个回答

29

你正在过度思考这个问题。 String 有自己的自然排序,即按字母顺序排列,因此您可以像这样使用 String.compareTo

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

啊,很好,那似乎是我需要的。感谢您的快速回复。 - Silver Duck
既然他是第一个回答正确的人,你应该接受他的答案,以避免这个问题没有答案。 (您应该按下投票下面的V) - Marco Acierno
有十分钟的延迟,所以我不能直接接受...但现在已经完成了。 - Silver Duck

4
return name.compareTo(otherObject.name);

String已经实现了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);
    }
}

1
存在许多优先于它的方式。但为了维护更好的兼容性、性能和避免运行时异常(比如空指针异常),使用最佳实践。
对于字符串:
@Override
    public int compareTo(OtherObject o) {
        return String.CASE_INSENSITIVE_ORDER.compare(this.name,o.name);
    }

对于int、double和float类型(为了避免装箱和拆箱对性能的影响,请使用以下比较器)

// 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);
    }

[Effective Java 条款14:考虑实现Comparable接口]

最后,每当您实现一个有意义的排序值类时,应该让这个类实现Comparable接口,以便其实例可以轻松地进行排序、搜索和用于基于比较的集合。在实现compareTo方法时,避免使用<和>运算符来比较字段值。相反,使用装箱原始类型类中的静态compare方法或Comparator接口中的比较器构造方法。


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