`

为了比较,让自己的类实现Comparable接口,重写compareTo

阅读更多


首先需要实现带泛型的Comparable接口,按照自己想要的排序方式重写compareTo,事实上在重写compareTo时,内核用到的依然是Integer、String、Charactor这些已经有自己compareTo的常用数据类型,只是加入了自己的一些想法而已。



第一个例子

/*为了比较,让自己的类实现Comparable接口,按照自己想要的排序方式重写compareTo
 *Map只是提供了对键的排序,但是当我们需要对值排序时就的提供我们自己的比较器 这里 只是模拟了Map但是实际上并没有使用Map

 */

import java.util.Iterator;

import java.util.Set;
import java.util.TreeSet;

public class SortByValue {

	public static void main(String[] args) {
		Set<Pair> set = new TreeSet<Pair>();
		set.add(new Pair("me", "1000"));
		set.add(new Pair("and", "4000"));
		set.add(new Pair("you", "3000"));
		set.add(new Pair("food", "10000"));
		set.add(new Pair("hungry", "5000"));
		set.add(new Pair("later", "6000"));
		set.add(new Pair("myself", "1000"));
		for (Iterator<Pair> i = set.iterator(); i.hasNext();)
			// 我喜欢这个for语句
			System.out.println(i.next());
	}
}

class Pair implements Comparable<Object> {
	private final String name;
	private final int number;

	public Pair(String name, int number) {
		this.name = name;
		this.number = number;
	}

	public Pair(String name, String number) throws NumberFormatException {
		this.name = name;
		this.number = Integer.parseInt(number);
	}

	public int compareTo(Object o) {
		if (o instanceof Pair) {
			// int cmp = Double.compare(number, ((Pair) o).number);
			int cmp = number - ((Pair) o).number;
			if (cmp != 0) {// number是第一要比较的,相当于先比较value。如果相同再比较键
				return cmp;
			}
			return name.compareTo(((Pair) o).name);
		}
		throw new ClassCastException("Cannot compare Pair with "
				+ o.getClass().getName());
	}

	public String toString() {
		return name + ' ' + number;
	}
}
输出结果:
me 1000
myself 1000
you 3000
and 4000
hungry 5000
later 6000
food 10000


第二个例子:

import java.util.*;

public class NameSort {
	public static void main(String[] args) {
		Name[] nameArray = { new Name("John", "Lennon"),
				new Name("Karl", "Marx"), new Name("Groucho", "Marx"),
				new Name("Oscar", "Grouch") };
		Arrays.sort(nameArray);
		for (int i = 0; i < nameArray.length; i++) {
			System.out.println(nameArray[i].toString());
		}
	}
}

class Name implements Comparable<Name> {
	public String firstName, lastName;

	public Name(String firstName, String lastName) {
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public int compareTo(Name o) { // 实现接口
		int lastCmp = lastName.compareTo(o.lastName);
		// 首先比较姓(lastName)如果姓相同(lastCmp==0)再比较名(firstName),否则返回名的比较
		return (lastCmp == 0 ? firstName.compareTo(o.firstName) : lastCmp);
	}

	public String toString() { // 便于输出测试
		return firstName + " " + lastName;
	}
}
输出结果:
Oscar Grouch
John Lennon
Groucho Marx
Karl Marx


//看看这个三目运算符的漂亮应用哦!
	public int compareTo(Pair o) {
		int cmp = number - o.number;
		return (cmp == 0 ? name.compareTo(o.name) : cmp);
	}
----------------------
	public int compareTo(Name o) { // 实现接口
		int lastCmp = lastName.compareTo(o.lastName);
		// 首先比较姓(lastName)如果姓相同(lastCmp==0)再比较名(firstName),否则返回名的比较
		return (lastCmp == 0 ? firstName.compareTo(o.firstName) : lastCmp);
	}


参考:http://han.guokai.blog.163.com/blog/static/136718271201001010228136/

http://develop.csai.cn/java/200905260937361763.htm


.
分享到:
评论

相关推荐

    关于重写equals,hashcode以及compareTo方法!

    在某些情况下,我们需要实现Comparable接口,并重写compareTo()方法,使其比较对象的大小。 需要注意的是,在重写compareTo()方法时,我们需要遵守一些规则,如传递性、反射性、一致性等。违反这些规则可能会出现...

    推选Comparable自比较接口PPT资料.pptx

    对于自定义类,如果需要进行比较和排序,也需要实现Comparable接口,并重写`compareTo()`方法。这是确保自定义类对象能参与排序的关键步骤。 实现Comparable接口的类应该遵循一个重要的原则:如果`compareTo()`方法...

    【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip

    具体实现方式是在类中重写`compareTo()`方法,根据业务逻辑定义比较规则。例如,如果我们有一个`Person`类,包含`age`属性,我们可以按照年龄排序: ```java public class Person implements Comparable&lt;Person&gt; { ...

    Java中Comparable和Comparator的区别

    当我们需要按照特定规则对类实例进行排序时,只需要在自定义类中实现Comparable接口,并重写`compareTo()`方法,定义比较逻辑即可。 Comparator接口则位于java.util包下,它提供了一个比较两个对象的方法`compare(T...

    Java 类自定义排序

    在上面的示例中,我们实现了 Comparable 接口,并重写了 compareTo 方法。在该方法中,我们首先对字符串进行排序,如果字符串不相等,则返回比较结果;否则,我们对日期进行排序,如果日期不相等,则返回比较结果;...

    浅析Java中comparator接口与Comparable接口的区别

    对于自定义类,如`Person`,如果想要支持排序,你需要在`Person`类中实现Comparable接口,并重写`compareTo(Person another)`方法,根据类的属性(如姓名、年龄)来定义比较规则。 而Comparator接口则不同,它不在...

    day016-list和set笔记以及代码.zip

    如果是自然排序,需要元素实现Comparable接口,重写compareTo方法 如果是定制排序,需要创建TreeSet对象的时候,传入一个Comparetor接口实现类对象,重写compare方法 一般是默认排序用自然排序(Comparable接口)...

    compareTo用法

    `Comparable`接口定义了一个`compareTo`方法,该方法用于比较两个实现了该接口的对象。当一个类实现了`Comparable`接口后,就表示该类的对象可以被排序,并且`compareTo`方法将用于控制这些对象的排序顺序。 #### `...

    comparable和compartor区别

    `Comparable`接口是一种内置的比较机制,它允许一个类能够自我比较,即一个类自己实现了如何与其他同类型的对象进行比较的方法。当我们希望一个类能够按照某种规则进行排序时,就可以让这个类实现`Comparable`接口,...

    Comparable&Comparator区别

    当一个类实现了`Comparable`接口时,意味着它可以与同类的其他对象进行比较,并根据某种逻辑排序。例如,`Integer`和`String`类就实现了`Comparable`接口。 ##### 2. 方法详解 - `int compareTo(Object o)`: 此方法...

    java中Comparable和Comparator的区别

    例如,String类就实现了Comparable接口,按照字符串的字典顺序进行比较。当你需要对一个集合(如ArrayList或LinkedList)进行排序时,只需确保其中的元素类型实现了Comparable接口,然后调用Collections.sort()方法...

    Hadoop大作业排序.zip

    在 java 中,要实现类的大小比较可以实现 Comparable 接口并通 过重写 compareTo 方法来实现。 在 Mapreduce 中,如果需要自定义类的排序规则,需要让类实现 Writable 的子接口 WritableComparable,重写里面的 ...

    Comparable接口和Comparator接口的比较

    Comparator接口允许我们为任何类定义自定义的比较逻辑,即使这个类没有实现Comparable接口。它提供了compare(T o1, T o2)方法,用于比较两个对象: ```java public interface Comparator&lt;T&gt; { int compare(T o1, T...

    Comparable与Comparator的区别

    例如,String、Integer等内置类已经实现了Comparable接口,可以方便地进行大小比较。当我们自定义一个类并希望它在集合(如List)中能自动排序时,就需要实现Comparable接口。通过重写`compareTo()`方法,我们可以...

    JAVA集合类.pdf

    如果你添加的不是天然可比较的对象,例如自定义的User类,那么你需要让User类实现Comparable接口,并重写compareTo()方法,定义排序规则。这样,当你向TreeSet添加User对象时,排序依据就是你在compareTo()方法中...

    java的Comparator和Comparable.docx

    例如,User 类原本没有排序功能,但当我们让它实现 Comparable&lt;User&gt; 接口后,就可以为 User 对象添加基于年龄的排序能力。通过重写 `compareTo(User o)` 方法,我们可以定义 User 对象之间比较的逻辑。在这个方法中...

    Java自然排序Comparable使用方法解析

    为了使用自然排序,元素所属的类需要实现Comparable接口,并重写compareTo方法。compareTo方法返回一个整数值,用于比较两个对象的顺序。如果返回值小于0,表示当前对象小于参数对象;如果返回值等于0,表示当前对象...

    对比Java中的Comparable排序接口和Comparator比较器接口

    Comparator接口包含两个方法:`compare(T o1, T o2)`用于比较两个对象的大小,以及`equals(Object obj)`,虽然可以不实现,但为了遵循通用的equals合同,建议在自定义Comparator时重写此方法以确保一致性。...

    Java 比较接口comparable与comparator区别解析

    然后,我们定义了一个名为 student 的类,该类实现了 MyComparable 接口,并重写了 compareTo() 方法。在 compareTo() 方法中,我们使用 num 变量来比较两个学生对象的大小顺序。 Comparator 接口 Comparator 接口...

Global site tag (gtag.js) - Google Analytics