java比较器,java的比较

本文目录一览:

java里的Collections类中的静态方法sort()是怎么用比较器比较两个对象?

compareto的确是返回一个(-1,0,1)的值。

pricecomparator

类的compare方法调用compareto,他的返回值也是(-1,0,1)中的一个。

collections.sort方法就是按照pricecomparator

类的compare方法来比较list的各个元素,进行排序。

collections.sort的源码我没有看过,不知道他具体使用什么方法排序,不过排序算法就那么几类:选择排序、插入排序、交换排序。估计是快速排序吧。

java中是不是有个方法能直接返回一个比较器的

java中每个方法的返回值,有且仅有一个,因为方法中一旦使用return语句返回返回值,整个方法就会结束,下面的语句也将不会执行。

java中如果想返回多个值的话,可以采用数组和集合进行存储,然后返回集合或者数组即可。其中数组用来封装基本数据类型的数据,集合用来封装对象数据。可以根据返回值的实际类型来选择容器。

java中Comparable和Comparator两种比较器的区别

Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器,基本的写法如下:

class Apple implements ComparableApple{

int id;

double price;

public Apple(int id, double price) {

this.id = id;

this.price = price;

}

public int compareTo(Apple o) {

//return Double.compare(this.getPrice(),o.getPrice());

if (Math.abs(this.price-o.price)0.001)

return 0;

else

return (o.price-this.price)0?1:-1;

}

@Override

public String toString() {

return “Apple{” +

“id=” + id +

“, price=” + price +

‘}’;

}

}

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else{

return (o1.price-o2.price)0?1:-1;

}

}

}

实现了Comparable接口的类需要实现compareTo()方法,传入一个外部参数进行比对,实现了Comparator接口的方法需要实现compare()方法,对外部传入的两个类进行比较,从而让外部方法在比较时调用。

两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动。两种接口的调用方式如下:

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else{

return (o1.price-o2.price)0?1:-1;

}

}

}

class DESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else {

return (o1.price-o2.price)0?-1:1;

}

}

}

public static void main(String[] args) {

Apple apple1 = new Apple(1,4.8);

Apple apple2 = new Apple(2,5.9);

Apple apple3 = new Apple(3,8.5);

ListApple list = new ArrayListApple();

list.add(apple1);

list.add(apple3);

list.add(apple2);

System.out.println(“Comparable==========”);

System.out.printf(“this list of apples: %s\n”,list);

Collections.sort(list);

System.out.printf(“this list of apples: %s\n”,list);

System.out.println(“Comparator==========”);

System.out.printf(“this list of apples: %s\n”,list);

Collections.sort(list,new DESComparator());

System.out.printf(“this list of apples: %s\n”,list);

Collections.sort(list,new AESComparator());

System.out.printf(“this list of apples: %s\n”,list);

}

}

上述代码存在的问题,不能在比较器中进行double类型的减法操作,因为对于值比较大的double,减法操作容易导致值的溢出,java7对每一种包装类型的比较新增了compare()方法,改造后的代码如下:

class Apple implements ComparableApple{

int id;

double price;

public Apple(int id, double price) {

this.id = id;

this.price = price;

}

public int compareTo(Apple o) {

return Double.compare(this.price,o.price);

}

@Override

public String toString() {

return “Apple{” +

“id=” + id +

“, price=” + price +

‘}’;

}

}

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

return Double.compare(o1.price,o2.price);

}

}

class DESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

return Double.compare(o2.price,o1.price);

}

}

查看Double.compare的源码如下

public static int compare(double d1, double d2) {

if (d1 d2)

return -1; // Neither val is NaN, thisVal is smaller

if (d1 d2)

return 1; // Neither val is NaN, thisVal is larger

// Cannot use doubleToRawLongBits because of possibility of NaNs.

long thisBits = Double.doubleToLongBits(d1);

long anotherBits = Double.doubleToLongBits(d2);

return (thisBits == anotherBits ? 0 : // Values are equal

(thisBits anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)

1)); // (0.0, -0.0) or (NaN, !NaN)

}

JAVA。比较器 JAVA比较器里面那个compare函数怎么实现升序或降序排列啊,retur

想当于一个比较规则,每两个一比较,如果返回正数则前者大,返回负数就后者大,直接return a-b就能实现,不需要用if else了

比较comparable和Comparator

Comparable Comparator 都是用来实现集合中的排序的 只是 Comparable 是在集合内部定义的方法实现的排序 Comparator 是在集合外部实现的排序 所以 如想实现排序 就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法  具体请看 Thinking   in   java Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String Integer 自己就可以完成比较大小操作) 而 Comparator 是一个专用的比较器 当这个对象不支持自比较或者自比较函数不能满足你的要求时 你可以写一个比较器来完成两个对象之间大小的比较  可以说一个是自已完成比较 一个是外部程序实现比较的差别而已  用 Comparator 是策略模式(strategy design pattern) 就是不改变对象自身 而用一个策略对象(strategy object)来改变它的行为  比如 你想对整数采用绝对值大小来排序 Integer 是不符合要求的 你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为 只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了  java 代码    // AbsComparator java     import   java util *;public   class   AbsComparator   implements   Comparator   {         public   int   pare(Object   o   Object   o )   {           int   v   =   Math abs(((Integer)o ) intValue());           int   v   =   Math abs(((Integer)o ) intValue());           return   v     v   ?     :   (v   ==   v   ?     :   );         }     }可以用下面这个类测试 AbsComparator  

// Test javaimport   java util *;

public   class   Test   {    public   static   void   main(String[]   args)   {

//产生一个 个随机整数的数组(有正有负)      Random   rnd   =   new   Random();      Integer[]   integers   =   new   Integer[ ];      for(int   i   =   ;   i      integers length;   i++)      integers[i]   =   new   Integer(rnd nextInt( )   *   (rnd nextBoolean()   ?      :   ));

system out println( 用Integer内置方法排序 );      Arrays sort(integers);      system out println(Arrays asList(integers));

  lishixinzhi/Article/program/Java/hx/201311/25976

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/275853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-17 16:06
下一篇 2024-12-17 16:06

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论