Guava:Ordering 排序工具

简介

排序器 Ordering 是 Guava流畅风格比较器 Comparator 的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。

从实现上说,Ordering 实例就是一个特殊的 Comparator 实例。Ordering 把很多基于 Comparator 的静态方法(如 Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器。

类方法说明

官方文档:Source code

方法名称方法描述
allEqual() 返回一个Ordering,所有值的排序地位都是平等的,表明无排序。 将此排序传递给任何稳定排序算法都不会导致元素顺序发生变化。
arbitrary() 返回所有对象的任意顺序,即compare(a, b) == 0 就是 a == b (identity equality)。 本身的排序是没有任何含义,但是在VM的生命周期是一个常量。
binarySearch(List<? extends T> sortedList, T key) 已过时,请使用 Collections.binarySearch(List, Object, Comparator).
compare(T left, T right) 比较两个参数的顺序。
compound(Comparator<? super U> secondaryComparator) 返回一个Ordering,传入比较器作为第二排序元素。
compound(Iterable<? extends Comparator<? super T>> comparators) 返回一个Ordering,会根据传入比较器集合一次比较,直到找到一个非零的结果。
explicit(List<T> valuesInOrder) 返回一个Ordering,根据他们出现在给定的列表的顺序比较对象
explicit(T leastValue, T... remainingValuesInOrder) 返回一个Ordering,比较对象根据它们的传入的顺序。
from(Comparator<T> comparator) 
返回一个传入comparator实例的Ordering。
from(Ordering<T> ordering) 已过时。 不需要使用它
greatestOf(Iterable<E> iterable, int k) 根据Ordering对传入iterable由大到小排序,返回前K位的集合。
greatestOf(Iterator<E> iterator, int k) 根据Ordering对传入iterable由大到小排序,返回前K位的集合。
immutableSortedCopy(Iterable<E> elements) 返回一个不可变的集合,包含根据Ordering对传入元素排序后的所有元素。
isOrdered(Iterable<? extends T> iterable) 根据Ordering对传入iterable元素迭代,如果下一个元素大于或等于上一个元素,返回true。
isStrictlyOrdered(Iterable<? extends T> iterable) 根据Ordering对传入iterable元素迭代,如果下一个元素严格大于上一个元素,返回true。
leastOf(Iterable<E> iterable, int k) 根据Ordering对传入iterable由小到大排序,返回前K位的集合。
leastOf(Iterator<E> iterator, int k) 根据Ordering对传入iterable由小到大排序,返回前K位的集合。
lexicographical() 返回一个新的Ordering,通过相应的元素两两迭代,直到找到一个非零的结果。强加“字典顺序”。
max(E a, E b) 根据Ordering返回传入参数的最大值。
max(E a, E b, E c, E... rest) 根据Ordering返回传入参数的最大值。
max(Iterable<E> iterable) 根据Ordering返回传入参数的最大值。
max(Iterator<E> iterator) 根据Ordering返回传入参数的最大值。
min(E a, E b) 根据Ordering返回传入参数的最小值。
min(E a, E b, E c, E... rest) 根据Ordering返回传入参数的最小值。
min(Iterable<E> iterable) 根据Ordering返回传入参数的最小值。
min(Iterator<E> iterator) 根据Ordering返回传入参数的最小值。
natural() 对可排序类型做自然排序,如数字按大小,日期按先后排序
nullsFirst() 根据Ordering排序,null值放在最前面,并使用它来比较非空值。
nullsLast() 根据Ordering排序,null值放在最后面,并使用此排序来比较非空值。
onResultOf(Function<F,? extends T> function) 将传入function应用到每个元素上面,再通过Ordering进行排序。
<S extends T>Ordering<S>reverse() 
返回与当前Ordering相反的排序。相当于 Collections.reverseOrder(Comparator)
<E extends T> List<E>sortedCopy(Iterable<E> elements) 
返回一个可变的集合,包含根据Ordering对传入元素排序后的所有元素。
usingToString() 根据toString返回的字符串按照字典顺序排序。

 使用Demo

import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.google.common.primitives.Doubles;
import junit.framework.TestCase;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.*;
import static java.util.Arrays.asList;/*** 排序*/
public class OrderingTests extends TestCase {/*** 1、allEqual 允许有null*/public void testAllEqual() {Ordering<Object> comparator = Ordering.allEqual();System.out.println(comparator.equals(comparator.reverse()));assertEquals(0, comparator.compare(null, null));assertEquals(0, comparator.compare(new Object(), new Object()));assertEquals(0, comparator.compare("apples", "oranges"));assertEquals("Ordering.allEqual()", comparator.toString());List<String> strings = ImmutableList.of("b", "a", "d", "c");List<String> sortedCopy = comparator.sortedCopy(strings);assertEquals(strings, sortedCopy);ImmutableList<String> immutableSortedCopy = comparator.immutableSortedCopy(strings);assertEquals(strings, immutableSortedCopy);}/*** 2、natural 不能有null*/public void testNatural() {Ordering<Integer> comparator = Ordering.natural();try {comparator.compare(1, null);fail();} catch (NullPointerException expected) {}try {comparator.compare(null, 2);fail();} catch (NullPointerException expected) {}try {comparator.compare(null, null);fail();} catch (NullPointerException expected) {}assertEquals("Ordering.natural()", comparator.toString());}/*** 3、List集合 复杂排序示例*/public void testComplicatedOrderingExample() {Ordering<Iterable<Integer>> example = Ordering.<Integer>natural().nullsFirst().reverse().lexicographical().reverse().nullsLast();List<Integer> list1 = Lists.newArrayList();List<Integer> list2 = Lists.newArrayList(1);List<Integer> list3 = Lists.newArrayList(1, 1);List<Integer> list4 = Lists.newArrayList(1, 2);List<Integer> list5 = Lists.newArrayList(1, null, 2);List<Integer> list6 = Lists.newArrayList(2);Integer nullInt = null;List<Integer> list7 = Lists.newArrayList(nullInt);List<Integer> list8 = Lists.newArrayList(nullInt, nullInt);List<List<Integer>> list = Lists.newArrayList(list1, list2, list3, list4, list5, list6, list7, list8, null);List<List<Integer>> sorted = example.sortedCopy(list);/*** [null, null]* [null]* [1, null, 2]* [1, 1]* [1, 2]* [1]* [2]* []* null*/sorted.forEach(System.out::println);}/*** 4、from 把给定的 Comparator 转化为排序器*/public void testFrom() {// String.CASE_INSENSITIVE_ORDER 按照 ASCII 排序Ordering<String> caseInsensitiveOrdering = Ordering.from(String.CASE_INSENSITIVE_ORDER);assertTrue(caseInsensitiveOrdering.compare("A", "a") == 0);assertTrue(caseInsensitiveOrdering.compare("a", "B") < 0);assertTrue(caseInsensitiveOrdering.compare("B", "a") > 0);ArrayList<String> list = Lists.newArrayList("dehua", "abcdef", "ABCDEF", "rapido", "lbsse","lasse");List<String> sortedCopy = caseInsensitiveOrdering.sortedCopy(list);sortedCopy.forEach(System.out::println);}/** 5、explicit(ExplicitOrdering)返回一个Ordering,根据它们的传入的顺序比较对象。只能比较参数列表中存在的对象*/public void testExplicit_none() {Comparator<Integer> c = Ordering.explicit(Collections.emptyList());try {c.compare(0, 0);} catch (Exception e) {
//            e.printStackTrace();}assertEquals("Ordering.explicit([])", c.toString());}public void testExplicit_one() {Comparator<Integer> c = Ordering.explicit(0);assertEquals(0, c.compare(0, 0));try {c.compare(0, 1);fail();} catch (Exception e) {
//            e.printStackTrace();}assertEquals("Ordering.explicit([0])", c.toString());}public void testExplicit_two() {
//        Comparator<Integer> c = Ordering.explicit(42, 5);
//        assertEquals(0, c.compare(5, 5));
//        assertTrue(c.compare(5, 42) > 0);
//        assertTrue(c.compare(42, 5) < 0);Comparator<Integer> c = Ordering.explicit(5, 10);assertEquals(0, c.compare(5, 5));assertTrue(c.compare(5, 10) < 0);assertTrue(c.compare(10, 5) > 0);try {c.compare(5, 9);fail();} catch (Exception e) {System.out.println(e.getMessage());}}public void testExplicit_three() {// explicit:根据传入对象的顺序排序Double first = 0.2;Double[] second = {0.1, 0.3, 0.5};List<Double> numbers = Lists.asList(first, second);//排序比较器:根据原始的大小排序Ordering<Double> peopleOrdering = new Ordering<Double>() {@Overridepublic int compare(Double left, Double right) {return Doubles.compare(left, right);}};peopleOrdering.reverse().explicit(numbers).sortedCopy(numbers).forEach(System.out::println);//[ 0.2,0.1, 0.3, 0.5]}public void testExplicit_sortingExample() {Comparator<Integer> c = Ordering.explicit(2, 8, 6, 1, 7, 5, 3, 4, 0, 9);List<Integer> list = Arrays.asList(0, 3, 5, 6, 7, 8, 9);Collections.sort(list, c);// 8, 6, 7, 5, 3, 0, 9list.forEach(System.out::println);}/*** key重复异常*/public void testExplicit_withDuplicates() {try {Ordering.explicit(1, 2, 3, 4, 2);fail();} catch (IllegalArgumentException expected) {expected.printStackTrace();}}/*** 6、arbitrary 返回所有对象的任意顺序*/public void testArbitrary_withoutCollisions() {List<Integer> list = Lists.newArrayList();for (int i = 0; i < 50; i++) {list.add(i);}Ordering<Object> arbitrary = Ordering.arbitrary();Collections.sort(list, arbitrary);list.forEach(System.out::println);assertEquals("Ordering.arbitrary()", arbitrary.toString());}/*** 7、usingToString* 按对象的字符串形式做字典排序 [lexicographical ordering]*/public void testUsingToString() {Ordering<Object> ordering = Ordering.usingToString();assertEquals("Ordering.usingToString()", ordering.toString());List<String> list = Lists.newArrayList("lasse", "jerry", "harry", "eva", "jhon", "neron");System.out.println("list:" + list);// 使用Comparable类型的自然顺序, 例如:整数从小到大,字符串是按字典顺序;Ordering<String> naturalOrdering = Ordering.natural();// 使用toString()返回的字符串按字典顺序进行排序;Ordering<Object> usingToStringOrdering = Ordering.usingToString();// 返回一个所有对象的任意顺序Ordering<Object> arbitraryOrdering = Ordering.arbitrary();System.out.println("naturalOrdering:" + naturalOrdering.sortedCopy(list));System.out.println("usingToStringOrdering:" + usingToStringOrdering.sortedCopy(list));System.out.println("arbitraryOrdering:" + arbitraryOrdering.sortedCopy(list));}/*** 8、reverse 取返*/public void testReverse() {List<String> list = Lists.newArrayList("lasse", "jerry", "harry", "eva", "jhon", "neron");Collections.sort(list, Ordering.natural().reverse());list.forEach(System.out::println);}private enum StringLengthFunction implements Function<String, Integer> {StringLength;@Overridepublic Integer apply(String string) {return string.length();}}/*** 9、onResultOf 将传入function应用到每个元素上面,再通过Ordering进行排序。*/public void testOnResultOf_1() {// 外部枚举函数Ordering<String> ordering = Ordering.natural().onResultOf(StringLengthFunction.StringLength);assertTrue(ordering.compare("to", "be") == 0);assertTrue(ordering.compare("or", "not") < 0);assertTrue(ordering.compare("that", "to") > 0);assertEquals("Ordering.natural().onResultOf(StringLength)", ordering.toString());ArrayList<String> list = Lists.newArrayList("lasse", "abcds", "ABCDEF", "rapido", "chengxumiao");ordering.sortedCopy(list).forEach(System.out::println);}public void testOnResultOf_2() {// 匿名内部类函数Ordering<String> ordering = Ordering.natural().onResultOf(new Function<String, Comparable>() {@Overridepublic Comparable apply(@Nullable String input) {return input.length();}});ArrayList<String> list = Lists.newArrayList("lasse", "abcds", "ABCDEF", "rapido", "chengxumiao");ordering.sortedCopy(list).forEach(System.out::println);}public void testOnResultOf_3() {// lambda 表达式函数Ordering<String> ordering = Ordering.natural().reverse().onResultOf(str -> str.length());ArrayList<String> list = Lists.newArrayList("lasse", "abcds", "ABCDEF", "rapido", "chengxumiao");ordering.sortedCopy(list).forEach(System.out::println);}/*** 10、nullsFirst*/public void testNullsFirst_NullsLast() {ArrayList<String> list = Lists.newArrayList("lasse", null, "abcds", "ABCDEF", null, "rapido", "chengxumiao");Collections.sort(list, Ordering.natural().nullsFirst());list.forEach(System.out::println);Ordering.natural().nullsLast().sortedCopy(list).forEach(System.out::println);}/*** 11、NullsLast*/public void testNullsLast() {ArrayList<String> list = Lists.newArrayList("tingfeng", null, "abcds", "ABCDEF", null, "rapido", "chengxumiao");Ordering.natural().nullsLast().sortedCopy(list).forEach(System.out::println);}/*** 12、isOrdered 下一个元素大于或等于上一个元素,返回true*/public void testIsOrdered() {Ordering<Comparable> ordering = Ordering.natural();assertFalse(ordering.isOrdered(asList(5, 3, 0, 9)));assertFalse(ordering.isOrdered(asList(0, 5, 3, 9)));assertTrue(ordering.isOrdered(asList(0, 3, 5, 9)));assertTrue(ordering.isOrdered(asList(0, 0, 3, 3)));assertTrue(ordering.isOrdered(asList(0, 3)));assertTrue(ordering.isOrdered(Collections.singleton(1)));assertTrue(ordering.isOrdered(Collections.<Integer>emptyList()));}/*** 13、isStrictlyOrdered 下一个元素大于上一个元素,返回true*/public void testIsStrictlyOrdered() {Ordering<Comparable> ordering = Ordering.natural();assertFalse(ordering.isStrictlyOrdered(asList(5, 3, 0, 9)));assertFalse(ordering.isStrictlyOrdered(asList(0, 5, 3, 9)));assertFalse(ordering.isStrictlyOrdered(asList(0, 0, 3, 3)));assertTrue(ordering.isStrictlyOrdered(asList(0, 3, 5, 9)));assertTrue(ordering.isStrictlyOrdered(asList(0, 3)));assertTrue(ordering.isStrictlyOrdered(Collections.singleton(1)));assertTrue(ordering.isStrictlyOrdered(Collections.<Integer>emptyList()));}/*** 判断集合是否只读*/private static void assertListImmutable(List<Integer> result) {try {result.set(0, 1);fail();} catch (UnsupportedOperationException expected) {// pass}}/*** 14、leastOf 有点类似截取集合前几位的概念*/public void testLeastOfIterable_simple_1() {List<Integer> result = Ordering.natural().leastOf(Arrays.asList(3, 4, 5, -1), 2);assertTrue(result instanceof RandomAccess);assertListImmutable(result);assertEquals(ImmutableList.of(-1, 3), result);}public void testLeastOfIterator_simple_1() {List<Integer> result = Ordering.natural().leastOf(Iterators.forArray(3, 4, 5, -1), 2);assertTrue(result instanceof RandomAccess);assertListImmutable(result);assertEquals(ImmutableList.of(-1, 3), result);}public void testLeastOfIterable_simple_nMinusOne_withNullElement() {List<Integer> list = Arrays.asList(3, null, 5, -1);List<Integer> result = Ordering.natural().nullsLast().leastOf(list, list.size() - 1);assertTrue(result instanceof RandomAccess);assertListImmutable(result);assertEquals(ImmutableList.of(-1, 3, 5), result);}/*** 15、min 和 max*/public void testIteratorMinAndMax() {Ordering<Comparable> ordering = Ordering.natural();List<Integer> ints = Lists.newArrayList(5, 3, 0, 9);assertEquals(9, (int) ordering.max(ints));assertEquals(0, (int) ordering.min(ints));assertEquals(9, (int) ordering.max(ints.iterator()));assertEquals(0, (int) ordering.min(ints.iterator()));assertEquals(9, (int) ordering.max(ints.listIterator()));assertEquals(0, (int) ordering.min(ints.listIterator()));// 当值相同时,返回第一个参数,此处a正确,b就不正确Integer a = new Integer(4);Integer b = new Integer(4);ints = Lists.newArrayList(a, b, b);assertSame(a, ordering.max(ints.iterator()));assertSame(a, ordering.min(ints.iterator()));}public void testIteratorMinExhaustsIterator() {List<Integer> ints = Lists.newArrayList(9, 0, 3, 5);Iterator<Integer> iterator = ints.iterator();assertEquals(0, (int) Ordering.natural().min(iterator));assertFalse(iterator.hasNext());}public void testIteratorMaxExhaustsIterator() {List<Integer> ints = Lists.newArrayList(9, 0, 3, 5);Iterator<Integer> iterator = ints.iterator();assertEquals(9, (int) Ordering.natural().max(iterator));assertFalse(iterator.hasNext());}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/609543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenWrt智能路由器Wan PPPoE拨号配置方法

OpenWrt智能路由器的wan PPPoE拨号配置方法和我们常见的不太一样, 需要先找到wan网卡,然后将协议切换为 PPPoE然后才能看到输入上网账号和密码的地方. 首先登录路由器 http://openwrt.lan/ 然后找到 Network --> Interfaces 这里会显示你当前的路由器的所有接口, 选择 …

WPS通配符匹配数字

1.WPS通配符[36][0-9]{3} 这个正则表达式 [36][0-9]{3} 的含义如下&#xff1a; [36]&#xff1a;表示匹配数字 3 或者数字 6 中的任意一个字符。[0-9]&#xff1a;代表匹配任意一个数字字符&#xff08;0 到 9&#xff09;。{3}&#xff1a;表示前面的表达式&#xff08;即 …

【Machine Learning】Supervised Learning

本笔记基于清华大学《机器学习》的课程讲义监督学习相关部分&#xff0c;基本为笔者在考试前一两天所作的Cheat Sheet。内容较多&#xff0c;并不详细&#xff0c;主要作为复习和记忆的资料。 Linear Regression Perceptron f ( x ) s i g n ( w ⊤ x b ) f(x)sign(w^\top x…

MySQL8.0 升级

将 MySQL8.0.30 升级到 MySQL8.0.32 备份旧数据 rootLAPTOP-FPIQJ438:/data/backup# xtrabackup --backup --userroot --password123456 --socket/tmp/mysql.sock --target-dir/data/backup/ 2024-01-08T16:46:38.98768708:00 0 [Note] [MY-011825] [Xtrabackup] recognized s…

CPU控制的独立式键盘扫描实验

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit S1P1^4; //将S1位定义为P1.4引脚 sbit S2P1^5; //将S2位定义为P1.5引脚 sbit S3P1^6; //将S3位定义为P1.6引脚 sbit S4P1^7; //将S4位定义为P1.7引脚 unsigned char keyval; /…

连接服务器Mysql出现“Host ‘xxx‘ is not allowed to connect to this MySQL server“解决方法

远程连接提示&#xff1a;Host xxx is not allowed to connect to this MySQL server。是mysql未开启mysql远程访问权限导致。 登录mysql&#xff0c;发现出现了 Access denied for user ‘root’ T’localhost (using password: YES) 此时先找到my.cnf文件,使用命令mysql --…

http跟https有什么区别?

HTTPS和HTTP的概念&#xff1a; HTTP&#xff1a;是互联网上应用最为广泛的一种网络协议&#xff0c;是一个客户端和服务器端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用于从WWW服务器传输超文本到本地浏览器的传输协议&#xff0c;它可以使浏览器更加高效&am…

智慧灌溉解决方案(基于物联网的智能灌溉系统)

​ 详情&#xff1a;智慧水务数字孪生安全监测解决方案提供商-星创 (key-iot.com.cn) 随着农业IOT的快速发展,智慧灌溉正成为提高农业水资源利用效率,实现精准灌溉的重要技术手段。完整的智慧灌溉系统由实地各类传感设备以及后台管理软件平台组成,可以实现对整个灌区的监测和精…

python(17)--文件的输入/输出

前言 在Python中&#xff0c;文件文本操作是非常重要的&#xff0c;主要有以下几个原因&#xff1a; 数据持久性&#xff1a;当你需要长期存储数据&#xff0c;如用户的个人信息、交易记录或数据库元数据等&#xff0c;将数据保存在文件中是一种常见的方法。文件系统提供了持…

非线性最小二乘问题的数值方法 —— 从高斯-牛顿法到列文伯格-马夸尔特法 (I)

Title: 非线性最小二乘问题的数值方法 —— 从高斯-牛顿法到列文伯格-马夸尔特法 (I) 文章目录 前言I. 从高斯-牛顿法II. 到阻尼高斯-牛顿法III. 再到列文伯格-马夸尔特法1. 列文伯格-马夸尔特法的由来2. 列文伯格-马夸尔特法的说明说明一. 迭代方向说明二. 近似于带权重的梯度…

步进电机介绍

一、什么是步进电机&#xff1a; 步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号&#xff0c;转子就转动一个角度或前进一步&#xff0c;其输出的角位移或线位移与输入的脉冲数成正比&#xff0c;转速与脉冲频率成正比。因此&#xff0c;步…

通付盾受邀出席2024安全市场年度大会,荣获“数字安全产业杰出贡献奖”!

1月5日&#xff0c;由国内数字产业独立的第三方调研咨询机构数世咨询主办&#xff0c;以“数字安全&#xff0c;未来可期”为主题的2024安全市场年度大会在北京举办。来自国内网络安全厂商300多人以线上线下方式参加本次大会&#xff0c;通过4个多小时高能演讲&#xff0c;聚焦…

线性代数_同济第七版

contents 前言第1章 行列式1.1 二阶与三阶行列式1.1.1 二元线性方程组与二阶行列所式1.1.2 三阶行列式 1.2 全排列和对换1.2.1 排列及其逆序数1.2.2 对换 1.3 n 阶行列式的定义1.4 行列式的性质1.5 行列式按行&#xff08;列&#xff09;展开1.5.1 引理1.5.2 定理1.5.3 推论 * …

【Vue】项目使用px2rem

使用方法 1.安装包 npm i postcss-px2rem2.编写配置文件 编写核心代码&#xff0c;命名随意&#xff0c;我这里命名为px2rem并放在src/utils文件夹内 // 基准大小 const baseSize 100 // 设置 rem 函数 function setRem() {// 当前页面宽度相对于 1920 宽的缩放比例&#xf…

RK3568平台开发系列讲解(驱动篇)pinctrl 函数操作集结构体讲解

🚀返回专栏总目录 文章目录 一、pinctrl_ops二、pinmux_ops三、pinconf_ops沉淀、分享、成长,让自己和他人都能有所收获!😄 pinctrl_ops:提供有关属于引脚组的引脚的信息。pinmux_ops:选择连接到该引脚的功能。pinconf_ops:设置引脚属性(上拉,下拉,开漏,强度等)。…

安全防御之可信计算技术

可信计算技术是一种计算机安全体系结构&#xff0c;旨在提高计算机系统在面临各种攻击和威胁时的安全性和保密性。它通过包括硬件加密、受限访问以及计算机系统本身的完整性验证等技术手段&#xff0c;确保计算机系统在各种攻击和威胁下保持高度安全和保密性。 一、可信计算基…

WPS Office找回丢失的工作文件

WPS office恢复办公文件方法有两种. 1.通过备份中心可以查看近期编辑 office 历史版本进行恢复. 2.缓存备份目录可以查看编辑过的 office 文件的历史版本&#xff0c;新版本 WPS 可以在配置工具-备份清理找到&#xff0c;2019 年旧版本 WPS 可以在新建任意 office 文件-文件-选…

【Java 设计模式】设计原则之单一职责原则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在面向对象设计中&#xff0c;单一职责原则是一个重要的设计原则之一。它提倡一个类应该只有一个原因引起变化&#xff0c;即一个类应该只有一个职责。在本文中&#xff0c;我们将深入研究单一职责原则&#xff0c;了解它的定义、优…

有信息搜索、最佳优先搜索、贪心搜索、A_搜索详解

文章目录 【人工智能】— 有信息搜索、最佳优先搜索、贪心搜索、A*搜索无/有信息的搜索Informed Search AlgorithmsBest-first search(最佳优先搜索)Greedy SearchA* Search解释说明A*搜索是代价最优的和完备的对搜索等值线如何理解【人工智能】— 有信息搜索、最佳优先搜索、贪…

异构微服务远程调用如何打jar包

1.服务提供方打 jar 包 RemoteUserService.java package com.finance.system.api;import com.finance.system.api.domain.dto.Enterprise; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springfra…