首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

代码中是如何调用compareTo方法的

2014-01-17 
代码中是怎么调用compareTo方法的[解决办法]排序的时候在比较两个对象时用compareTo方法.import java.util

代码中是怎么调用compareTo方法的


[解决办法]
排序的时候在比较两个对象时用compareTo方法.

import java.util.Arrays;

class AlohaPerson implements Comparable<AlohaPerson> {
    private String name;

    AlohaPerson(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return name;
    }

    @Override
    public int compareTo(AlohaPerson o) {
        return this.name.compareTo(o.name);
    }
}

public class Aloha {
    public static void sort(AlohaPerson[] persons) {
        // 用选择排序法排序
        for (int i = 0; i < persons.length - 1; ++i) {
            int k = i;

            for (int j = k; j < persons.length; ++j) {
                // 排序的时候在比较两个对象时用compareTo方法.
                if (persons[j].compareTo(persons[k]) < 0) {
                    k = j;
                }
            }

            if (k != i) {
                AlohaPerson temp = persons[k];
                persons[k] = persons[i];


                persons[i] = temp;
            }
        }
    }

    public static void main(String[] args) {
        AlohaPerson[] persons = {
                new AlohaPerson("Bob"),
                new AlohaPerson("John"),
                new AlohaPerson("Smith"),
                new AlohaPerson("Alpha"),
                new AlohaPerson("Beta")
        };

        System.out.println(Arrays.toString(persons));
        sort(persons);
        System.out.println(Arrays.toString(persons));
    }
}


输出
[Bob, John, Smith, Alpha, Beta]
[Alpha, Beta, Bob, John, Smith]

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

这种东西楼主看TreeSet的源码就知道了....
TreeSet的底层实现其实是TreeMap在每次add的时候也就是调用TreeMap的put方法这时如果有外部比较器Comparator的实现就会调用外部的Comparator的比较方法,如果没有就会调用实现Comparable接口的类的compareTo方法

就是一楼说的这个,Set不允许有重复的元素,所以使用add()方法是,在方法内部会调用对象的compareTo方法以判断两个对象是否相等
能不能用程序帮我具体实现一下呢? 

你可以看一下TreeSet的add方法源码
public boolean add(E e) {
return m.put(e, PRESENT)==null;
    }

其中,m是TreeMap的一个实例,再看一下TreeMap中的put方法源码
public V put(K key, V value) {
        Entry<K,V> t = root;
        if (t == null) {
    // TBD:
    // 5045147: (coll) Adding null to an empty TreeSet should
    // throw NullPointerException
    //
    // compare(key, key); // type check
            root = new Entry<K,V>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        else {
            if (key == null)
                throw new NullPointerException();
            Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;


                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        Entry<K,V> e = new Entry<K,V>(key, value, parent);
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }


其中Comparable<? super K> k = (Comparable<? super K>) key;就要求K类型的实例要实现Comparable接口,在cmp = k.compareTo(t.key);就会调用自己实现的compareTo()方法,具体怎么进行比较,就是由你自己实现的。
上面的源码都是JDK6版本的

热点排行