compareto返回1和-1的区别_温故篇:Comparable与Compatator的区别

2023-05-16

前言:

在实际开发中,经常需要对某些数据进行比较,例如我们在网购的时候,检索某件商品,它会按照价格,收藏等等关键词展示出来,当中的展示规则便是对商品间的某个相同数据比较后所得出来的。

在Java中,数据比较通常用到两个接口:

1、实体类 java.lang.Comparable +compareTo

该接口只有一个实现方法compareTo,一般用于自然排序

compareTo返回有三种结果:即

A.compareTo(B)>0 ,即使A>B
A.compareTo(B)=0 ,即使A=B
A.compareTo(B)<0 ,即使A<B

2、业务定制排序类 java.util.Comparator +compare

该接口提供了一个compare实现方法,广泛应用于自定义业务排序中,它有如下有势:

1)解耦:与实体类分离,出现不同的业务需求时无序改动实体类

2)方便:应对多变的排序规则

来看看具体例子:

①创建实体类Goods:

/**
 * 	实体类
 * @author Jave Chan
 *
 */
public class Goods {
	
	private String name;  //商品名
	private double price;	//价格
	private int fav;	//收藏量
	
	public Goods() {
		super();
	}
	public Goods(String name, double price, int fav) {
		super();
		this.name = name;
		this.price = price;
		this.fav = fav;
		
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrive(double price) {
		this.price = price;
	}
	public int getFav() {
		return fav;
	}
	public void setFav(int fav) {
		this.fav = fav;
	}
	
	@Override
	public String toString() {
		return "Goods: [name=" + name + ", price=" + price + ", fav=" + fav + "]";
	}
	
}

②创建Comparator接口实现类GoodsPriceComparator,根据价格进行排序:

/**
 * 	按价格排序的业务类(降序)
 * @author Jave Chan
 *
 */
public class GoodsPriceComparator implements java.util.Comparator<Goods>{
 
	@Override
	public int compare(Goods o1, Goods o2) {
		//o2-o1>0==>o2>o1==>返回1,否则做进一步判断,相等返回0,o2-o1<0即o2<01时返回-1
		return -(o1.getPrice()-o2.getPrice())>0 ? 1:(o1.getPrice()==o2.getPrice()?0:-1);
	}
 
}

③创建Comparator接口实现类GoodsFavComparator,根据收藏量进行排序:

/**
 * 	按收藏量排序的业务类(升序)
 * @author Jave Chan
 *
 */
public class GoodsFavComparator implements java.util.Comparator<Goods>{
 
	@Override
	public int compare(Goods o1, Goods o2) {
		return o1.getFav() - o2.getFav();
	}
 
}

④创建排序类GoodsApp,将Comparator对象作为参数传递,添加compare方法中使用的自定义类,实现不修改实体类情况下根据不同情况进行排序,实现解耦

/**
 * 
 * @author Jave Chan
 *
 */
public class GoodsApp {
	
	public static void main(String[] args) {
		List<Goods> list = new ArrayList<Goods>();
		list.add(new Goods("潮汕牛肉丸", 50.0, 100));
		list.add(new Goods("潮汕肠粉", 150.0, 200));
		list.add(new Goods("潮汕功夫茶", 100.0, 120));
		
		System.out.println("排序前:" + list);
		Collections.sort(list, new GoodsFavComparator());  //根据不同喜好排序,不必修改实体类
		System.out.println("排序后(按收藏量升序):" + list);
		Collections.sort(list, new GoodsPriceComparator());  //根据价格排序,同上,实现解耦
		System.out.println("排序后(按价格降序):" + list);
	}
}

⑤运行结果如下:


总结:

1、Comparable:自然排序,实体类直接实现;

2、Comparator:自制业务排序,在调用方法时直接创建,耦合度低;

3、对于一些引用数据类型,例如包装类,它们都内置实现了Comparable接口中的compareTo()方法,可以直接使用!

以上,是Comparable与Compatator的区别 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

compareto返回1和-1的区别_温故篇:Comparable与Compatator的区别 的相关文章

  • JAVA IO前言Comparable & Comparator & 序列化Serializable & 反序列化Deserializable

    Comparable可认为是内比较器 可比较的 是接口类 类参数为泛型对象T 通常对比的类本身需实现继承Comparable接口类的唯一方法compareTo T o 对比指标为类的一个或多个属性 对比类与Comparable接口类耦合性强
  • Double型比较大小 compareTo()

    public class DoubleCompare public static void main String args Double d1 100 0 Double d2 90 0 Double d3 150 005 int i 10
  • 当compareto返回0时理解TreeSet

    我创建了一个这样的学生课程 public class Student implements Comparable
  • 为什么 Collections.sort 使用相同的参数调用 Comparator 两次?

    我正在运行一个示例来了解 Java 中比较器的行为 import java util ArrayList import java util Collections import java util Comparator class HDTV
  • 无法对基本类型 double 调用compareTo(double)

    线路return array index1 compareTo array index2 提供了一个错误 无法对基本类型 double 调用compareTo double 如何解决这个问题 This function implements
  • 为什么java.lang.Number不实现Comparable? [复制]

    这个问题在这里已经有答案了 有谁知道为什么java lang Number不执行Comparable 这意味着您无法排序Numbers with Collections sort我觉得这有点奇怪 讨论后更新 感谢所有有用的回复 我最终做了关
  • 根据值对 List> 进行排序

    基本上我有一个List
  • 对枚举值进行排序

    我想知道是否有任何方法可以为不同的类订购枚举 例如 如果我有一组固定的化学物质 它们以不同的方式与其他化学物质发生反应 有些反应强烈 有些反应较弱 我基本上希望能够根据该组应该反应的化学物质 即取决于类别 来改变它们的排列顺序 我确实知道我
  • 比较方法违反了它的一般契约!仅限 Java 7

    我知道这个问题已经有一段时间了 并检查了我之前能得到的所有答案 但这个仍然不起作用 对象 crew 代表具有等级和其他项目的船员 应通过比较 int 值 signed rank 来进行比较 如果两个实例中该值相等 则布尔值 is train
  • 如何高效地比较Set? [复制]

    这个问题在这里已经有答案了 给定两个集合 如何在 Java 中有效地比较它们 a 将它们保留为Lists 对它们进行排序并比较 Comparable b 将它们保留为Set并比较hashCode集合的 背景 需要进行很多比较 集合很小 通常
  • 使用compareTo和Collections.sort

    我有一个特许经营类别 其中包含所有者 特许经营所有者名称 州 特许经营所在州的 2 个字符串 和销售额 当天的总销售额 public class Franchise implements Comparable
  • 如何在一个类中创建 2 个可比较的方法?

    我有一个类 我已经按一个属性对其进行了排序 现在我需要做另一件事 我需要创建另一种方法来对数据进行排序 我该怎么做呢 所以我可以选择两种方法 我知道的唯一命令是 Collections sort 它将从我想要比较其数据的类中获取方法comp
  • Java - CompareTo 和运算符

    如果我有课Person实现Comparable 比较personA height to personB height 例如 是否可以使用 personA lt personB 作为替代品 personA compareTo personB
  • Java:使用 Collat​​orKey 对集合进行排序

    我想要实现的是按字符串值对对象集合进行排序 但是 以依赖于语言环境的方式使用整理器 由于性能原因 我不想使用 Collat orcompare 方法 如下代码所示 而是使用 Collat ionKey 类 因为 java API 声明使用
  • 实现 Comparable 以使用字符串按字母顺序排序

    我希望有一个可比较的对象 在这种情况下在 TreeSet 中使用它 我的对象有一个名称字段 我希望它按字母顺序排序 我首先想到我可以使用字符串的 unicode 值并简单地进行减法 但是 AA 会在 Ab 之后 我是这样开始的 public
  • 使用 Comparable 比较通用变量

    对于我班级中的一个作业 我们有一个名为 Pair 的类的集合 我们需要根据键的值按升序对其进行排序 如果键是字符串或整数 我可以应用此方法 但是如何编写代码来比较我的项目 当它们是通用的时 如下所示 我班上的教授解释了如何处理整数或字符串
  • 无法转换为 [Ljava.lang.Comparable

    所以我需要做动态有序列表 public class DynArrayListOrd
  • 具有可比较列表与 TreeSet

    选项 1 创建一个实现 Comparable 的列表 并在每次添加值时使用 collections sort List l 对它进行排序 选项 2 创建一个 TreeSet 它始终保持排序 哪一个会更快 我问这个是因为 List 为我提供了
  • 为什么 CompareTo 这么短地实现?

    考虑以下代码 namespace ConsoleApplication1 class Program static void Main string args Console WriteLine 100 CompareTo 200 prin
  • Collections.sort() 错误

    我正在尝试根据 A 类的 int r 对 B 类中名为 BinOrder 的 A 类型列表进行排序 但是我收到了 Collections sort BinOrder 行的此错误 The method sort List

随机推荐