java集合Comparator_Java集合中Comparable和Comparator辨析

一.Comparable和Comparator简介

在对集合元素进行比较时一般使用TreeSet.对于简单的数据类型,TreeSet可以直接进行比较。但是对于复杂的数据类型,比如自己定义的数据类型或者类,就需要自己设置比较方法与比较规则了,这时就需要使用Comparable和Comparator。 Comparable和Comparator都是用来实现集合中的排序的,只是Comparable是在集合内图定义的方法实现排序,而Comparator是在集合外部实现的排序。所以如果想对结合排序,需要在集合外定义Comparator接口的方法或在集合内部实现Comparable接口的方法。

一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的结合就可以直接使用sort方法排序。

Comparator是策略模式,就是在不改变对象自身,而用一种策略对象来改变它的行为,将算法和数据分离,Comparator还可以在下面两种环境下使用:

1.类在设计时没有考虑到比较问题而没有实现Comparable接口,则可以通过Comparator来实现排序而不必修改原来的类代码。

2.类设计时实现了Comparable接口,但是后面的使用者却想用一种新的比较规则对类进行比较

二。用法示例:

Comparable排序:

首先定义实现Comparable接口的Item类

package com.collection;

import Java.util.Objects;

/**

* @author朱伟

* 定义实现Comparable接口的Item类

*

*/

public class Item implements Comparable{

private String description;

private int partNumber;

public Item(String aDescription, int aPartNumber)

{

description = aDescription;

partNumber = aPartNumber;

}

public String getDescription()

{

return description;

}

public String toString()

{

return "[description="+description+",partNumber="+partNumber+"]";

}

public boolean equals(Object otherObject)

{

if(this == otherObject)

return true;

if(otherObject == null)

return false;

if(getClass()!=otherObject.getClass())

return false;

Item other = (Item)otherObject;

return Objects.equals(description, other.description) &&partNumber == other.partNumber;

}

public int hashCode()

{

return Objects.hash(description,partNumber);

}

//重载compareTo方法,设定Item对象的比较方法

@Override

public int compareTo(Item other)

{

return Integer.compare(partNumber, other.partNumber);

}

}

Comparator排序实现示例:

首先定义需要排序的类People

package com.collection;

public class People

{

private String name;

public String getName()

{

return name;

}

public void setName(String name)

{

this.name = name;

}

public int getAge()

{

return age;

}

public void setAge(int age)

{

this.age = age;

}

private int age;

public People(String name,int age)

{

this.name = name;

this.age = age;

}

public String toString()

{

return ("name:"+this.name+",age:"+this.age);

}

}

接着建立对People进行排序的类,利用Comparator进行排序有两种方法,第一种方法是把需要排序的People对象放在List集合中,然后调用Collection.sort(list,comparator)方法进行排序;第二中排序方法是直接把Comparator对象传递给TreeSet的构造器,并重载Comparator类的compara方法,指定排序规则,这种方法不需要让People类实现Comparator接口,且其代码较简洁。

Comparator

package com.collection;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Collections;

import java.util.Comparator;

import java.util.HashSet;

import java.util.List;

import java.util.SortedSet;

import java.util.TreeSet;

public class ListSortWithComparator

{

publicstatic void main(String[] args)

{

/*

* 使用comparator进行排序的第一种方法,

* 定义一个实现Comparator接口的类,并重载compara方法,设定比较规则

* 利用Collection.sort(list,comparator)方法实现排序,

* Collection.sort(list,comparator)方法的第一个参数为List类型,因此要排序的元素需要放在List集合中

*/

Listlist = new ArrayList<>();

list.add(newPeople("zhuwei",26));

list.add(newPeople("yinyuchun",25));

list.add(newPeople("xiaobai",26));

MComparatorcomparator = new MComparator();

Collections.sort(list,comparator);

for(Peoplep:list)

{

System.out.println(p.toString());

}

/*

* 使用comparator进行排序的第二种方法,

* 该方法不需要People实现Comparator接口

* 直接Comparator对象传递给TreeSet的构造器,

* 并重载Comparator类的compara方法,指定排序规则

*/

//    SortedSetset = new TreeSet<>(

//            newComparator()

//            {

//

//                //重载Comparator类的compara方法,设定比较规则:按名字降序排列

//                @Override

//                publicint compare(People people1, People people2)

//                {

//                  //TODO Auto-generated method stub

//                  if(people1.getName().compareTo(people2.getName())>0)

//                  {

//                      return-1;

//                  }

//                  else

//                  {

//                      return1;

//                  }

//

//                }

//

//            }

//            );

//    set.addAll(list);

//    System.out.println("输出按降序排列的结果:");

//    for(Peoplep: set)

//    {

//        System.out.println(p.toString());

//    }

}

}

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaComparableComparator都是用于进行对象比较的接口。它们的用法如下: 1. Comparable接口 Comparable接口是Java内置的接口,它包含一个方法compareTo(),用于比较对象的大小。实现该接口的类可以直接进行排序。 例如,我们定义一个Person类实现Comparable接口: ``` public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public int compareTo(Person person) { // 按照年龄进行排序 return this.age - person.age; } } ``` 在这个例子,我们通过实现Comparable接口,并重写compareTo()方法,按照年龄进行排序。 使用Comparable接口进行排序的例子: ``` List<Person> list = new ArrayList<Person>(); list.add(new Person("Tom", 20)); list.add(new Person("Jerry", 18)); list.add(new Person("Jack", 25)); Collections.sort(list); for(Person p : list) { System.out.println(p.getName() + " " + p.getAge()); } ``` 输出结果: ``` Jerry 18 Tom 20 Jack 25 ``` 2. Comparator接口 Comparator接口也是Java内置的接口,它包含一个方法compare(),用于比较两个对象的大小。实现该接口的类可以定制不同的比较规则。 例如,我们定义一个PersonComparator类实现Comparator接口: ``` public class PersonComparator implements Comparator<Person> { public int compare(Person p1, Person p2) { // 按照姓名进行排序 return p1.getName().compareTo(p2.getName()); } } ``` 在这个例子,我们通过实现Comparator接口,并重写compare()方法,按照姓名进行排序。 使用Comparator接口进行排序的例子: ``` List<Person> list = new ArrayList<Person>(); list.add(new Person("Tom", 20)); list.add(new Person("Jerry", 18)); list.add(new Person("Jack", 25)); Collections.sort(list, new PersonComparator()); for(Person p : list) { System.out.println(p.getName() + " " + p.getAge()); } ``` 输出结果: ``` Jack 25 Jerry 18 Tom 20 ``` 总之,ComparableComparator都是用于对象比较的接口。使用Comparable接口可以方便地对实现该接口的对象进行排序,而使用Comparator接口可以定制不同的比较规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值