Java之策略模式比较器案例讲解
作者:无敌小田田 发布时间:2021-12-25 22:24:32
标签:Java,比较器
Comparable 比较器,内置定义的比较方法,实现比较 较简单
Comparator 策略模式,需要定义不同的策略和比较的对象,实现比较 较复杂
打个比方,狗有foot一种属性我们用Comparable比较器完成比较
猫有height和weight两种属性,我们用Comparator策略模式完成比较
一、Comparable --狗比较
缺点:自定义排序规则,规则定义好之后,再改起来就不方便,还需要重新开发Sort比较类
1、狗对象
package com.longze.guosh.strategy;
public class Dog implements Comparable<Dog> {
int food; //狗的饭量
public Dog(int food){
this.food=food;
}
@Override //自定义排序规则,规则定义好之后,再改起来就不方便
public int compareTo(Dog d) {
if(this.food<d.food) return -1;
else if(this.food>d.food) return 1;
else return 0;
}
@Override
public String toString() {
return "Dog{" +
"food=" + food +
'}';
}
}
2、狗的比较类,也可以代表猫的汽车的比较类,但是比较策略无法修改((除非改原来的方法))
package com.longze.guosh.strategy;
import java.util.Comparator;
public class DogSorter {
//排序
public static void sort(Comparable[] arr){
for(int i=0;i< arr.length-1;i++){
int minPos=i;
for(int j=i+1;j<arr.length;j++){
minPos=arr[j].compareTo(arr[minPos])==-1?j:minPos;
}
swap(arr,i,minPos);
}
}
//交换
static void swap(Comparable[] arr,int i,int j){
Comparable temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
3、main方法验证
package com.longze.guosh.strategy;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Dog[] ds= {new Dog(8),new Dog(5),new Dog(10),new Dog(1)};
//comparater
DogSorter dogsorter=new DogSorter();
dogsorter.sort(ds);
System.out.println("Dogs==="+Arrays.toString(ds));
}
}
二、Comparator 策略模式
优点,可以定义多种比较策略,不需要改sort比较类
1、猫对象
package com.longze.guosh.strategy;
public class Cat{
int weight,height;
public Cat(int weight,int height){
this.height=height;
this.weight=weight;
}
@Override
public String toString() {
return "Cat{" +
"weight=" + weight +
", height=" + height +
'}';
}
}
2、猫的比较策略,可以有多种策略
如【CatHeightComparator.java】身高比较器 【CatWeightComparator】体重比较器
package com.longze.guosh.strategy;
import java.util.Comparator;
public class CatHeightComparator implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
if (o1.height > o2.height) {
return -1;
} else if (o1.height < o2.height) {
return 1;
}else {
return 0;
}
}
}
package com.longze.guosh.strategy;
import java.util.Comparator;
public class CatWeightComparator implements Comparator<Cat> {
@Override
public int compare(Cat o1, Cat o2) {
if (o1.weight < o2.weight) {
return -1;
} else if (o1.weight > o2.weight) {
return 1;
}else {
return 0;
}
}
}
3、比较器 也可以用作狗或者其他比较类,比较策略可以重新指定不同的
package com.longze.guosh.strategy;
import java.util.Comparator;
public class Sorter<T> {
public void sort(T[] arr, Comparator<T> comparator){
for(int i=0;i< arr.length-1;i++){
int minPos=i;
for(int j=i+1;j<arr.length;j++){
minPos=comparator.compare(arr[j],arr[minPos])==-1?j:minPos;
}
swap(arr,i,minPos);
}
}
void swap(T[] arr,int i,int j){
T temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
4、Main校验
package com.longze.guosh.strategy;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Cat[] cs={new Cat(3,3),new Cat(5,5),new Cat(1,1),new Cat(10,10)};
//comparator
Sorter<Cat> catsorter=new Sorter<>();
catsorter.sort(cs,new CatHeightComparator());
System.out.println("Cat==="+Arrays.toString(cs));
}
}
综上所述 使用简单比较器直接实现Comparable类,就可以完成
当使用策略模式时,需要实现不同的Comparator策略,配合Sort可以完成比较
Git地址:https://gitee.com/feng-qingxuan/dessign-pattrns.git strategy
来源:https://blog.csdn.net/qq_36602951/article/details/119493586


猜你喜欢
- 主要功能:勾选子节点的checkbox,右边会动态加载该节点的信息,出现TextBox让用户填写节点的值,点击保存按钮将文本框的值保存到对应
- 在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一
- 一、饿汉式(静态常量)public class Face { private stat
- 在C#中用同一个dataset保存从数据库中取出的多张表:cmd.CommandText = "select * from tab
- 1. Spring Boot Condition功能与作用@Conditional是基于条件的自动化配置注解, 由Spring 4框架推出的
- 正式版:版本最新但只有14天的体验时间,之后需要激活,激活注册已经不行了,现在需要使用新的方式:首先下载反向代理工具,下载地址:根据系统选择
- Springboot使用test无法启动test无法启动,遇到java.lang.IllegalStateException: Unable
- 本文实例为大家分享了C#实现飞行棋游戏的具体代码,供大家参考,具体内容如下游戏截图:管理类:using System;using Syste
- 线程池线程池全称为托管线程池,线程池受 .NET 通用语言运行时(CLR)管理,线程的生命周期由 CLR 处理,因此我们可以专注于实现任务,
- 字体池的应用,主要是为了解决字体不断创建导致句柄泄漏/内存泄漏的问题,这个问题在Android上也同样存在。经测试,C# WinForm原生
- java.util.concurrent.ExecutionException错误信息,这里给出解决方案,大家根据具体要求更改。SEVERE
- 本文实例讲述了Java设计模式之工厂模式实现方法。分享给大家供大家参考,具体如下:工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体
- 流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏。说明IDE:AS,Android studio;模拟器:genymotion;实
- 在jdk文档中对RandomAccess接口的定义如下: public interface RandomAccess下面是jdk
- 最大堆最大堆的特点是父元素比子元素大,并且是一棵完全二叉树。data[1]开始存,data[0]空着不用。也可以把data[0]当成size
- 本文主要介绍了Android studio利用gradle打jar包并混淆的方法,下面话不多说,来看看详细的介绍吧。首先打jar包的配置很简
- 效果图如下所述:布局<?xml version="1.0" encoding="utf-8"?
- /** * 三角数字: * 比达哥斯拉领导下的古希腊数学家发现了一个有趣的数字序列1, 3, 6, 10, 15, 21,... *
- —举例(学生排课)—正常思路的处理方法和优化过后的处理方法:比如说给学生排课。学生和课程是一个多对多的关系。按照正常的逻辑 应该有一个关联表
- 一、树形结构树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树