From 924137acbcab85540c5c9de3273599f290c45175 Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 26 Dec 2024 00:30:03 +0800 Subject: [PATCH 1/6] add ImmutableByteArray --- README.md | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 41b8878..14ff570 100644 --- a/README.md +++ b/README.md @@ -78,28 +78,29 @@ mvn clean install ## 4. 更新日志 -| 版本 | 说明 | -| ------ | ------------------------------------------------------------ | -| 1.0.21 | KeyValue 和 ByteArray 增加静态方法 | -| 1.0.20 | Futures 增加 awaitAll 方法 | -| 1.0.19 | 优化 SimpleJSON 实现:如果 field 为 public,即使无 readMethod,也读取属性值 | -| 1.0.18 | 优化 RandomUtils 实现,通过 threadId 计算 index ,并获取数组对应 index 的 Random 实例 | -| 1.0.17 | 优化 SimpleJSON 实现,仅获取 readMethod,支持非标准 JavaBean | -| 1.0.16 | remove ThreadLocalRandom,change to Random[] | -| 1.0.15 | add ArrayUtils.fill | -| 1.0.14 | 1. add Codec
2. add Compressor | -| 1.0.13 | 1. add Futures
2. add ByteArray
3. add KeyValue & ExpireKeyValue | -| 1.0.12 | 1. 修改部分文档说明 | +| 版本 | 说明 | +|--------|----------------------------------------------------------------------------------------------------------------------------| +| 1.0.22 | add ImmutableByteArray | +| 1.0.21 | KeyValue 和 ByteArray 增加静态方法 | +| 1.0.20 | Futures 增加 awaitAll 方法 | +| 1.0.19 | 优化 SimpleJSON 实现:如果 field 为 public,即使无 readMethod,也读取属性值 | +| 1.0.18 | 优化 RandomUtils 实现,通过 threadId 计算 index ,并获取数组对应 index 的 Random 实例 | +| 1.0.17 | 优化 SimpleJSON 实现,仅获取 readMethod,支持非标准 JavaBean | +| 1.0.16 | remove ThreadLocalRandom,change to Random[] | +| 1.0.15 | add ArrayUtils.fill | +| 1.0.14 | 1. add Codec
2. add Compressor | +| 1.0.13 | 1. add Futures
2. add ByteArray
3. add KeyValue & ExpireKeyValue | +| 1.0.12 | 1. 修改部分文档说明 | | 1.0.11 | 1. 添加 ConcurrentHashSet
2. 添加 PlatformThreadFactory
3. 添加 VirtualThreadFactory
4. 升级为支持 JDK 21,不再支持 JDK 17 | -| 1.0.10 | 1. 添加 SimpleJSON(仅实现对象转 JSONString)
2. 升级为支持 JDK 17,不再支持 JDK 8 | -| 1.0.9 | 1. 添加 RandomUtils | -| 1.0.8 | 1. 添加 Maps.newHashMap方法 | -| 1.0.7 | 1. 添加 IOUtils.closeQuietly方法 | -| 1.0.6 | 1. Found 删除 node 字段,NodeHelper 增加精确匹配方法 | -| 1.0.5 | 1. 调整部分方法返回值 | -| 1.0.4 | 1. 增加测试用例;2. 编写参考文档;3.调整部分代码 | -| 1.0.3 | 1. 调整DigestUtils默认小写 | -| 1.0.2 | 1. 补充完整注释 | -| 1.0.1 | 1. 增加测试用例 2. 删除 Lists类 | -| 1.0.0 | 1. 添加常用工具类 2. 添加 ConcurrentHashTrie 字典树 | +| 1.0.10 | 1. 添加 SimpleJSON(仅实现对象转 JSONString)
2. 升级为支持 JDK 17,不再支持 JDK 8 | +| 1.0.9 | 1. 添加 RandomUtils | +| 1.0.8 | 1. 添加 Maps.newHashMap方法 | +| 1.0.7 | 1. 添加 IOUtils.closeQuietly方法 | +| 1.0.6 | 1. Found 删除 node 字段,NodeHelper 增加精确匹配方法 | +| 1.0.5 | 1. 调整部分方法返回值 | +| 1.0.4 | 1. 增加测试用例;2. 编写参考文档;3.调整部分代码 | +| 1.0.3 | 1. 调整DigestUtils默认小写 | +| 1.0.2 | 1. 补充完整注释 | +| 1.0.1 | 1. 增加测试用例 2. 删除 Lists类 | +| 1.0.0 | 1. 添加常用工具类 2. 添加 ConcurrentHashTrie 字典树 | From b05bd31aab8e5d01ebf5ea21856ddff9ce31a03a Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 26 Dec 2024 00:35:24 +0800 Subject: [PATCH 2/6] 2.0.13 --- README.md | 4 ++-- docs/Reference.md | 8 ++++---- pom.xml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 14ff570..94d0baa 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,14 @@ xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不 com.igeeksky.xtool xtool - 1.0.22 + 1.0.23 ``` ### 2.2.Gradle ```groovy -implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.22' +implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.23' ``` ### 2.3.编译安装 diff --git a/docs/Reference.md b/docs/Reference.md index 1b0b8ed..2b06a55 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -1,6 +1,6 @@ -## xtool-1.0.10参考文档 +## xtool 参考文档 -Author: [Patrick.Lau](mailto:patricklauxx@gmail.com) Version: 1.0.22 +Author: [Patrick.Lau](mailto:patricklauxx@gmail.com) Version: 1.0.23 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![Release](https://img.shields.io/github/v/release/patricklaux/xtool)](https://github.com/patricklaux/xtool/releases) [![Maven Central](https://img.shields.io/maven-central/v/com.igeeksky.xtool/xtool.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22com.igeeksky.xtool%22%20AND%20a:%22xtool%22) [![codecov](https://codecov.io/gh/patricklaux/xtool/branch/main/graph/badge.svg?token=VJ87A1IAVH)](https://codecov.io/gh/patricklaux/xtool) [![Last commit](https://img.shields.io/github/last-commit/patricklaux/xtool)](https://github.com/patricklaux/xtool/commits) [![Join the chat at https://gitter.im/igeeksky/xtool](https://badges.gitter.im/igeeksky/xtool.svg)](https://gitter.im/igeeksky/xtool?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -26,14 +26,14 @@ xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不 com.igeeksky.xtool xtool - 1.0.22 + 1.0.23 ``` #### 1.2.2.Gradle ```groovy -implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.22' +implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.23' ``` #### 1.2.3.编译安装 diff --git a/pom.xml b/pom.xml index b8409b0..3f89907 100644 --- a/pom.xml +++ b/pom.xml @@ -6,15 +6,15 @@ com.igeeksky.xtool xtool - 1.0.22 + 1.0.23 xtool xtool is a very small set of Java tools. https://github.com/patricklaux/xtool - 5.10.2 - 2.15.4 + 5.11.4 + 2.18.2 From 91387467c6be0bccf522c5721a3784e37da827de Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 26 Dec 2024 00:36:06 +0800 Subject: [PATCH 3/6] 1.0.23 --- docs/TODO.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/TODO.md b/docs/TODO.md index 67494c0..34368e5 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -1,6 +1,6 @@ ### 已完成任务 -- [X] 【开发】 ByteArray +- [X] 【开发】 ByteArray, ImmutableByteArray - [X] 【开发】 KeyValue, ExpireKeyValue - [X] 【开发】 Codec - [X] 【开发】 Compressor From 4b622db6e40dbb919779d3bee56fbae71b766b62 Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 26 Dec 2024 00:37:22 +0800 Subject: [PATCH 4/6] 1.0.23 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 94d0baa..32d3b3f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## 1. 简介 xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不求大而全,但求小而美。主要包含: - + - 字符串、数值、集合、IO等工具类; - 一些常用自定义注解; - NLP 相关的数据结构(主要实现:支持并发的高性能的字典树) From ac3fddd843fe2786720f85434f590dc6c28fe716 Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 26 Dec 2024 00:37:40 +0800 Subject: [PATCH 5/6] 1.0.23 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3f89907..69c5401 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ 5.11.4 2.18.2 - + 21 From 7be76b217f5e3676cca4bfd7783d3eaaba11dcb0 Mon Sep 17 00:00:00 2001 From: patrick Date: Tue, 7 Jan 2025 19:16:22 +0800 Subject: [PATCH 6/6] 1.1.0 --- README.md | 55 ++-- docs/Reference.md | 28 +- pom.xml | 8 +- .../{function/tuple => }/ExpiryKeyValue.java | 5 +- .../core/{function/tuple => }/KeyValue.java | 22 +- .../xtool/core/{function/tuple => }/Pair.java | 47 ++-- .../xtool/core/annotation/ParameterNames.java | 38 --- .../xtool/core/concurrent/Futures.java | 10 +- .../xtool/core/function/tuple/Pairs.java | 55 ---- .../xtool/core/json/MethodResolver.java | 5 +- .../igeeksky/xtool/core/json/SimpleJSON.java | 2 +- .../igeeksky/xtool/core/lang/ObjectUtils.java | 104 ++++++++ .../com/igeeksky/xtool/core/nlp/BaseNode.java | 4 +- .../xtool/core/nlp/ConcurrentHashTrie.java | 12 +- .../com/igeeksky/xtool/core/nlp/Found.java | 79 ++---- .../igeeksky/xtool/core/nlp/NodeHelper.java | 4 +- .../com/igeeksky/xtool/core/nlp/Trie.java | 28 +- .../core/{function => }/tuple/Tuple.java | 2 +- .../core/{function => }/tuple/Tuple1.java | 13 +- .../core/{function => }/tuple/Tuple2.java | 19 +- .../core/{function => }/tuple/Tuple3.java | 25 +- .../core/{function => }/tuple/Tuple4.java | 31 +-- .../core/{function => }/tuple/Tuple5.java | 38 ++- .../core/{function => }/tuple/Tuples.java | 2 +- .../tuple => }/ExpiryKeyValueTest.java | 2 +- .../com/igeeksky/xtool/core/KeyValueTest.java | 188 +++++++++++++ .../core/{function/tuple => }/PairTest.java | 49 ++-- .../core/function/tuple/KeyValueTest.java | 117 --------- .../xtool/core/function/tuple/PairsTest.java | 42 --- .../xtool/core/lang/ObjectUtilsTest.java | 247 ++++++++++++++++++ .../core/nlp/ConcurrentHashTrie2Test.java | 28 +- .../core/nlp/ConcurrentHashTrieTest.java | 18 +- .../igeeksky/xtool/core/nlp/FoundTest.java | 4 +- .../com/igeeksky/xtool/core/nlp/NodeTest.java | 4 +- .../core/{function => }/tuple/Tuple1Test.java | 2 +- .../core/{function => }/tuple/Tuple2Test.java | 2 +- .../core/{function => }/tuple/Tuple3Test.java | 2 +- .../core/{function => }/tuple/Tuple4Test.java | 2 +- .../core/{function => }/tuple/Tuple5Test.java | 2 +- .../core/{function => }/tuple/TupleTest.java | 2 +- 40 files changed, 790 insertions(+), 557 deletions(-) rename src/main/java/com/igeeksky/xtool/core/{function/tuple => }/ExpiryKeyValue.java (94%) rename src/main/java/com/igeeksky/xtool/core/{function/tuple => }/KeyValue.java (87%) rename src/main/java/com/igeeksky/xtool/core/{function/tuple => }/Pair.java (72%) delete mode 100644 src/main/java/com/igeeksky/xtool/core/annotation/ParameterNames.java delete mode 100644 src/main/java/com/igeeksky/xtool/core/function/tuple/Pairs.java create mode 100644 src/main/java/com/igeeksky/xtool/core/lang/ObjectUtils.java rename src/main/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple.java (95%) rename src/main/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple1.java (86%) rename src/main/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple2.java (86%) rename src/main/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple3.java (85%) rename src/main/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple4.java (84%) rename src/main/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple5.java (84%) rename src/main/java/com/igeeksky/xtool/core/{function => }/tuple/Tuples.java (97%) rename src/test/java/com/igeeksky/xtool/core/{function/tuple => }/ExpiryKeyValueTest.java (99%) create mode 100644 src/test/java/com/igeeksky/xtool/core/KeyValueTest.java rename src/test/java/com/igeeksky/xtool/core/{function/tuple => }/PairTest.java (62%) delete mode 100644 src/test/java/com/igeeksky/xtool/core/function/tuple/KeyValueTest.java delete mode 100644 src/test/java/com/igeeksky/xtool/core/function/tuple/PairsTest.java create mode 100644 src/test/java/com/igeeksky/xtool/core/lang/ObjectUtilsTest.java rename src/test/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple1Test.java (97%) rename src/test/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple2Test.java (98%) rename src/test/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple3Test.java (98%) rename src/test/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple4Test.java (98%) rename src/test/java/com/igeeksky/xtool/core/{function => }/tuple/Tuple5Test.java (98%) rename src/test/java/com/igeeksky/xtool/core/{function => }/tuple/TupleTest.java (95%) diff --git a/README.md b/README.md index 32d3b3f..298cbb4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## 1. 简介 xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不求大而全,但求小而美。主要包含: - + - 字符串、数值、集合、IO等工具类; - 一些常用自定义注解; - NLP 相关的数据结构(主要实现:支持并发的高性能的字典树) @@ -20,14 +20,14 @@ xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不 com.igeeksky.xtool xtool - 1.0.23 + 1.1.0 ``` ### 2.2.Gradle ```groovy -implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.23' +implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.1.0' ``` ### 2.3.编译安装 @@ -78,29 +78,30 @@ mvn clean install ## 4. 更新日志 -| 版本 | 说明 | -|--------|----------------------------------------------------------------------------------------------------------------------------| -| 1.0.22 | add ImmutableByteArray | -| 1.0.21 | KeyValue 和 ByteArray 增加静态方法 | -| 1.0.20 | Futures 增加 awaitAll 方法 | -| 1.0.19 | 优化 SimpleJSON 实现:如果 field 为 public,即使无 readMethod,也读取属性值 | -| 1.0.18 | 优化 RandomUtils 实现,通过 threadId 计算 index ,并获取数组对应 index 的 Random 实例 | -| 1.0.17 | 优化 SimpleJSON 实现,仅获取 readMethod,支持非标准 JavaBean | -| 1.0.16 | remove ThreadLocalRandom,change to Random[] | -| 1.0.15 | add ArrayUtils.fill | -| 1.0.14 | 1. add Codec
2. add Compressor | -| 1.0.13 | 1. add Futures
2. add ByteArray
3. add KeyValue & ExpireKeyValue | -| 1.0.12 | 1. 修改部分文档说明 | +| 版本 | 说明 | +| ------ | ------------------------------------------------------------ | +| 1.1.0 | 1. remove @ParameterNames
2. add ObjectUtils
3. tuple move to root package | +| 1.0.22 | add ImmutableByteArray | +| 1.0.21 | KeyValue 和 ByteArray 增加静态方法 | +| 1.0.20 | Futures 增加 awaitAll 方法 | +| 1.0.19 | 优化 SimpleJSON 实现:如果 field 为 public,即使无 readMethod,也读取属性值 | +| 1.0.18 | 优化 RandomUtils 实现,通过 threadId 计算 index ,并获取数组对应 index 的 Random 实例 | +| 1.0.17 | 优化 SimpleJSON 实现,仅获取 readMethod,支持非标准 JavaBean | +| 1.0.16 | remove ThreadLocalRandom,change to Random[] | +| 1.0.15 | add ArrayUtils.fill | +| 1.0.14 | 1. add Codec
2. add Compressor | +| 1.0.13 | 1. add Futures
2. add ByteArray
3. add KeyValue & ExpireKeyValue | +| 1.0.12 | 1. 修改部分文档说明 | | 1.0.11 | 1. 添加 ConcurrentHashSet
2. 添加 PlatformThreadFactory
3. 添加 VirtualThreadFactory
4. 升级为支持 JDK 21,不再支持 JDK 17 | -| 1.0.10 | 1. 添加 SimpleJSON(仅实现对象转 JSONString)
2. 升级为支持 JDK 17,不再支持 JDK 8 | -| 1.0.9 | 1. 添加 RandomUtils | -| 1.0.8 | 1. 添加 Maps.newHashMap方法 | -| 1.0.7 | 1. 添加 IOUtils.closeQuietly方法 | -| 1.0.6 | 1. Found 删除 node 字段,NodeHelper 增加精确匹配方法 | -| 1.0.5 | 1. 调整部分方法返回值 | -| 1.0.4 | 1. 增加测试用例;2. 编写参考文档;3.调整部分代码 | -| 1.0.3 | 1. 调整DigestUtils默认小写 | -| 1.0.2 | 1. 补充完整注释 | -| 1.0.1 | 1. 增加测试用例 2. 删除 Lists类 | -| 1.0.0 | 1. 添加常用工具类 2. 添加 ConcurrentHashTrie 字典树 | +| 1.0.10 | 1. 添加 SimpleJSON(仅实现对象转 JSONString)
2. 升级为支持 JDK 17,不再支持 JDK 8 | +| 1.0.9 | 1. 添加 RandomUtils | +| 1.0.8 | 1. 添加 Maps.newHashMap方法 | +| 1.0.7 | 1. 添加 IOUtils.closeQuietly方法 | +| 1.0.6 | 1. Found 删除 node 字段,NodeHelper 增加精确匹配方法 | +| 1.0.5 | 1. 调整部分方法返回值 | +| 1.0.4 | 1. 增加测试用例;2. 编写参考文档;3.调整部分代码 | +| 1.0.3 | 1. 调整DigestUtils默认小写 | +| 1.0.2 | 1. 补充完整注释 | +| 1.0.1 | 1. 增加测试用例 2. 删除 Lists类 | +| 1.0.0 | 1. 添加常用工具类 2. 添加 ConcurrentHashTrie 字典树 | diff --git a/docs/Reference.md b/docs/Reference.md index 2b06a55..c5f3464 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -26,14 +26,14 @@ xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不 com.igeeksky.xtool xtool - 1.0.23 + 1.1.0 ``` #### 1.2.2.Gradle ```groovy -implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.23' +implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.1.0' ``` #### 1.2.3.编译安装 @@ -2002,11 +2002,11 @@ public class ConcurrentHashTrieTest { String text = "为什么不准发布?敏感词真敏感!"; List> match = trie.match(text); - Assert.assertEquals("[{\"start\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"start\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", match.toString()); + Assert.assertEquals("[{\"begin\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"begin\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", match.toString()); // match 与 matchAll 对比,起始位置 8:contains只返回“敏感”;matchAll 返回了“敏感”和“敏感词”; List> matchAll = trie.matchAll(text); - Assert.assertEquals("[{\"start\":8, \"end\":9, \"key\":\"敏感\", \"value\":\"敏感\"}, {\"start\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"start\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", matchAll.toString()); + Assert.assertEquals("[{\"begin\":8, \"end\":9, \"key\":\"敏感\", \"value\":\"敏感\"}, {\"begin\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"begin\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", matchAll.toString()); } @@ -2023,46 +2023,46 @@ public class ConcurrentHashTrieTest { // match 与 matchAll 对比 List> match = trie.match("xxabcdexx"); - Assert.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); List> matchAll = trie.matchAll("xxabcdexx"); - Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString()); // match 参数变化对比 // 最长匹配;逐字符扫描 match = trie.match("xxabcdexx", true, true); - Assert.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); // 最长匹配;跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配 match = trie.match("xxabcdexx", true, false); - Assert.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", match.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", match.toString()); // 最短匹配;逐字符扫描 match = trie.match("xxabcdexx", false, true); - Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); // 最短匹配;跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配 match = trie.match("xxabcdexx", false, false); - Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", match.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", match.toString()); // matchAll 参数变化对比 // 逐字符扫描;最大返回数量为Integer.MAX_VALUE matchAll = trie.matchAll("xxabcdexx", true, Integer.MAX_VALUE); - Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString()); // 跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配;最大返回数量为Integer.MAX_VALUE matchAll = trie.matchAll("xxabcdexx", false, Integer.MAX_VALUE); - Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", matchAll.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", matchAll.toString()); // 逐字符扫描;最大返回数量为1 matchAll = trie.matchAll("xxabcdexx", true, 1); - Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString()); // 跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配;最大返回数量为1 matchAll = trie.matchAll("xxabcdexx", false, 1); - Assert.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString()); + Assert.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString()); } } ``` diff --git a/pom.xml b/pom.xml index 69c5401..c1549ae 100644 --- a/pom.xml +++ b/pom.xml @@ -6,18 +6,18 @@ com.igeeksky.xtool xtool - 1.0.23 + 1.1.0 xtool xtool is a very small set of Java tools. https://github.com/patricklaux/xtool - + 5.11.4 2.18.2 - + - + 21 21 3.13.0 diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/ExpiryKeyValue.java b/src/main/java/com/igeeksky/xtool/core/ExpiryKeyValue.java similarity index 94% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/ExpiryKeyValue.java rename to src/main/java/com/igeeksky/xtool/core/ExpiryKeyValue.java index 71e06f7..ce7bfb2 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/ExpiryKeyValue.java +++ b/src/main/java/com/igeeksky/xtool/core/ExpiryKeyValue.java @@ -1,6 +1,4 @@ -package com.igeeksky.xtool.core.function.tuple; - -import com.igeeksky.xtool.core.annotation.ParameterNames; +package com.igeeksky.xtool.core; import java.util.function.Function; @@ -19,7 +17,6 @@ public class ExpiryKeyValue extends KeyValue { * @param value 值 * @param ttl 存活时长 */ - @ParameterNames({"key", "value", "ttl"}) public ExpiryKeyValue(K key, V value, long ttl) { super(key, value); this.ttl = ttl; diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/KeyValue.java b/src/main/java/com/igeeksky/xtool/core/KeyValue.java similarity index 87% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/KeyValue.java rename to src/main/java/com/igeeksky/xtool/core/KeyValue.java index 5166000..be56c18 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/KeyValue.java +++ b/src/main/java/com/igeeksky/xtool/core/KeyValue.java @@ -15,12 +15,11 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core; -import com.igeeksky.xtool.core.annotation.ParameterNames; +import com.igeeksky.xtool.core.lang.ObjectUtils; import java.io.Serializable; -import java.util.Objects; import java.util.function.Function; /** @@ -37,7 +36,6 @@ public class KeyValue implements Serializable { private final V value; - @ParameterNames({"key", "value"}) public KeyValue(K key, V value) { this.key = key; this.value = value; @@ -125,16 +123,20 @@ public static KeyValue create(K key, V value) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof KeyValue keyValue)) return false; - - return Objects.equals(getKey(), keyValue.getKey()) && Objects.equals(getValue(), keyValue.getValue()); + if (this == o) { + return true; + } + if (!(o instanceof KeyValue kv)) { + return false; + } + return ObjectUtils.deepEquals(getKey(), kv.getKey()) && + ObjectUtils.deepEquals(getValue(), kv.getValue()); } @Override public int hashCode() { - int result = Objects.hashCode(key); - result = 31 * result + Objects.hashCode(value); + int result = ObjectUtils.deepHashCode(key); + result = 31 * result + ObjectUtils.deepHashCode(value); return result; } diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Pair.java b/src/main/java/com/igeeksky/xtool/core/Pair.java similarity index 72% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/Pair.java rename to src/main/java/com/igeeksky/xtool/core/Pair.java index d8913ee..b144e96 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Pair.java +++ b/src/main/java/com/igeeksky/xtool/core/Pair.java @@ -15,12 +15,11 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core; -import com.igeeksky.xtool.core.annotation.ParameterNames; +import com.igeeksky.xtool.core.lang.ObjectUtils; import java.io.Serializable; -import java.util.Objects; import java.util.function.Function; /** @@ -31,28 +30,22 @@ */ public record Pair(K key, V value) implements Serializable { - @ParameterNames({"key", "value"}) - public Pair { - } + private static final Pair EMPTY = new Pair<>(null, null); - /** - * 获取 key - * - * @return 键 - */ - @Override - public K key() { - return key; + public static Pair create(K key, V value) { + return new Pair<>(key, value); } /** - * 获取 value + * 静态工厂:返回不包含值的 {@link Pair} 单例对象 * - * @return 值 + * @param 键类型 + * @param 值类型 + * @return {@link Pair} -- singleton */ - @Override - public V value() { - return value; + @SuppressWarnings("unchecked") + public static Pair emptyPair() { + return (Pair) EMPTY; } public Pair map(Function keyMapper, Function valueMapper) { @@ -101,16 +94,20 @@ public boolean hasValue() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Pair pair)) return false; - - return Objects.equals(key(), pair.key()) && Objects.equals(value(), pair.value()); + if (this == o) { + return true; + } + if (!(o instanceof Pair pair)) { + return false; + } + return ObjectUtils.deepEquals(key, pair.key()) && + ObjectUtils.deepEquals(value, pair.value()); } @Override public int hashCode() { - int result = Objects.hashCode(key()); - result = 31 * result + Objects.hashCode(value()); + int result = ObjectUtils.deepHashCode(key); + result = 31 * result + ObjectUtils.deepHashCode(value); return result; } diff --git a/src/main/java/com/igeeksky/xtool/core/annotation/ParameterNames.java b/src/main/java/com/igeeksky/xtool/core/annotation/ParameterNames.java deleted file mode 100644 index cbaa5ac..0000000 --- a/src/main/java/com/igeeksky/xtool/core/annotation/ParameterNames.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2021 Patrick.lau All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.igeeksky.xtool.core.annotation; - -import java.lang.annotation.*; - -/** - * 记录参数名称信息 - *

- * JDK 1.8 之前不记录构造器和方法的参数名称;JDK 1.8 及之后的版本如果编译时未指定 -parameters,则默认不记录参数名称。 - * 因此需通过注解记录参数名信息,反射时才能根据名称匹配构造器和方法。 - * - * @author Patrick.Lau - * @since 0.0.4 2021-10-08 - */ -@Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface ParameterNames { - - String[] value() default {}; - -} diff --git a/src/main/java/com/igeeksky/xtool/core/concurrent/Futures.java b/src/main/java/com/igeeksky/xtool/core/concurrent/Futures.java index 157a19e..8a8d625 100644 --- a/src/main/java/com/igeeksky/xtool/core/concurrent/Futures.java +++ b/src/main/java/com/igeeksky/xtool/core/concurrent/Futures.java @@ -180,7 +180,7 @@ public static int checkAll(int start, Future[] futures) { * @param start 起始位置,从此位置开始取消未完成的任务 * @param futures 任务列表 */ - public static void cancelAll(int start, Future[] futures) { + public static void cancelAll(int start, Future[] futures, boolean mayInterruptIfRunning) { int i = start, len = futures.length; for (; i < len; i++) { Future future = futures[i]; @@ -188,7 +188,10 @@ public static void cancelAll(int start, Future[] futures) { if (future.isDone()) { continue; } - future.cancel(true); + if (future.isCancelled()) { + continue; + } + future.cancel(mayInterruptIfRunning); } } } @@ -207,6 +210,9 @@ public static void cancelAll(int start, ArrayList> futures) { if (future.isDone()) { continue; } + if (future.isCancelled()) { + continue; + } future.cancel(true); } } diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Pairs.java b/src/main/java/com/igeeksky/xtool/core/function/tuple/Pairs.java deleted file mode 100644 index 92360f8..0000000 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Pairs.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2021 Patrick.lau All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.igeeksky.xtool.core.function.tuple; - -/** - * 键值对工具类 - * - * @author Patrick.Lau - * @since 0.0.4 2021-10-21 - */ -public class Pairs { - - private static final Pair EMPTY = new Pair<>(null, null); - - /** - * 静态工厂:构建 {@link Pair} 对象 - * - * @param key 键 - * @param value 值 - * @param 键类型 - * @param 值类型 - * @return {@link Pair} - */ - public static Pair of(K key, V value) { - return new Pair<>(key, value); - } - - /** - * 静态工厂:返回不包含值的 {@link Pair} 单例对象 - * - * @param 键类型 - * @param 值类型 - * @return {@link Pair} -- singleton - */ - @SuppressWarnings("unchecked") - public static Pair emptyPair() { - return (Pair) EMPTY; - } - -} diff --git a/src/main/java/com/igeeksky/xtool/core/json/MethodResolver.java b/src/main/java/com/igeeksky/xtool/core/json/MethodResolver.java index 394fc8d..d230e4c 100644 --- a/src/main/java/com/igeeksky/xtool/core/json/MethodResolver.java +++ b/src/main/java/com/igeeksky/xtool/core/json/MethodResolver.java @@ -1,8 +1,7 @@ package com.igeeksky.xtool.core.json; +import com.igeeksky.xtool.core.Pair; import com.igeeksky.xtool.core.collection.Maps; -import com.igeeksky.xtool.core.function.tuple.Pair; -import com.igeeksky.xtool.core.function.tuple.Pairs; import com.igeeksky.xtool.core.lang.StringUtils; import java.beans.Transient; @@ -43,7 +42,7 @@ public static List> resolveReadMethod(Class beanCla List> properties = new ArrayList<>(readMethods.size()); for (Map.Entry entry : readMethods.entrySet()) { - properties.add(Pairs.of(entry.getKey().toCharArray(), entry.getValue())); + properties.add(Pair.create(entry.getKey().toCharArray(), entry.getValue())); } return properties; diff --git a/src/main/java/com/igeeksky/xtool/core/json/SimpleJSON.java b/src/main/java/com/igeeksky/xtool/core/json/SimpleJSON.java index e04e7ad..858ac35 100644 --- a/src/main/java/com/igeeksky/xtool/core/json/SimpleJSON.java +++ b/src/main/java/com/igeeksky/xtool/core/json/SimpleJSON.java @@ -1,7 +1,7 @@ package com.igeeksky.xtool.core.json; import com.igeeksky.xtool.core.collection.Maps; -import com.igeeksky.xtool.core.function.tuple.Pair; +import com.igeeksky.xtool.core.Pair; import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; diff --git a/src/main/java/com/igeeksky/xtool/core/lang/ObjectUtils.java b/src/main/java/com/igeeksky/xtool/core/lang/ObjectUtils.java new file mode 100644 index 0000000..16f6192 --- /dev/null +++ b/src/main/java/com/igeeksky/xtool/core/lang/ObjectUtils.java @@ -0,0 +1,104 @@ +package com.igeeksky.xtool.core.lang; + +import java.util.Arrays; + +/** + * Object 工具类 + * + * @author Patrick.Lau + * @since 1.0.0 + */ +public final class ObjectUtils { + + /** + * 获取对象的哈希值 + * + * @param obj 对象 + * @return 哈希值 + */ + public static int deepHashCode(Object obj) { + if (obj == null) { + return 0; + } + if (obj.getClass().isArray()) { + return arrayHashCode(obj); + } + return obj.hashCode(); + } + + private static int arrayHashCode(Object o) { + if (o instanceof Object[] array) { + return Arrays.deepHashCode(array); + } + if (o instanceof byte[] array) { + return Arrays.hashCode(array); + } + if (o instanceof int[] array) { + return Arrays.hashCode(array); + } + if (o instanceof long[] array) { + return Arrays.hashCode(array); + } + if (o instanceof char[] array) { + return Arrays.hashCode(array); + } + if (o instanceof short[] array) { + return Arrays.hashCode(array); + } + if (o instanceof boolean[] array) { + return Arrays.hashCode(array); + } + if (o instanceof double[] array) { + return Arrays.hashCode(array); + } + return Arrays.hashCode((float[]) o); + } + + public static boolean deepEquals(Object o1, Object o2) { + if (o1 == o2) { + return true; + } + if (o1 == null || o2 == null) { + return false; + } + if (o1.equals(o2)) { + return true; + } + if (o1.getClass().isArray() && o2.getClass().isArray()) { + return arrayDeepEquals(o1, o2); + } + return false; + } + + private static boolean arrayDeepEquals(Object o1, Object o2) { + if (o1 instanceof Object[] && o2 instanceof Object[]) { + return Arrays.deepEquals((Object[]) o1, (Object[]) o2); + } + if (o1 instanceof byte[] && o2 instanceof byte[]) { + return Arrays.equals((byte[]) o1, (byte[]) o2); + } + if (o1 instanceof int[] && o2 instanceof int[]) { + return Arrays.equals((int[]) o1, (int[]) o2); + } + if (o1 instanceof long[] && o2 instanceof long[]) { + return Arrays.equals((long[]) o1, (long[]) o2); + } + if (o1 instanceof char[] && o2 instanceof char[]) { + return Arrays.equals((char[]) o1, (char[]) o2); + } + if (o1 instanceof short[] && o2 instanceof short[]) { + return Arrays.equals((short[]) o1, (short[]) o2); + } + if (o1 instanceof double[] && o2 instanceof double[]) { + return Arrays.equals((double[]) o1, (double[]) o2); + } + if (o1 instanceof float[] && o2 instanceof float[]) { + return Arrays.equals((float[]) o1, (float[]) o2); + } + if (o1 instanceof boolean[] && o2 instanceof boolean[]) { + return Arrays.equals((boolean[]) o1, (boolean[]) o2); + } + return false; + } + +} diff --git a/src/main/java/com/igeeksky/xtool/core/nlp/BaseNode.java b/src/main/java/com/igeeksky/xtool/core/nlp/BaseNode.java index d5600fb..0d562d4 100644 --- a/src/main/java/com/igeeksky/xtool/core/nlp/BaseNode.java +++ b/src/main/java/com/igeeksky/xtool/core/nlp/BaseNode.java @@ -87,12 +87,10 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof BaseNode)) { + if (!(o instanceof BaseNode baseNode)) { return false; } - BaseNode baseNode = (BaseNode) o; - if (getC() != baseNode.getC()) { return false; } diff --git a/src/main/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrie.java b/src/main/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrie.java index 74c0325..cc8ae47 100644 --- a/src/main/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrie.java +++ b/src/main/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrie.java @@ -17,8 +17,8 @@ package com.igeeksky.xtool.core.nlp; -import com.igeeksky.xtool.core.function.tuple.Tuple2; -import com.igeeksky.xtool.core.function.tuple.Tuples; +import com.igeeksky.xtool.core.tuple.Tuple2; +import com.igeeksky.xtool.core.tuple.Tuples; import com.igeeksky.xtool.core.lang.Assert; import com.igeeksky.xtool.core.lang.IntegerValue; @@ -131,7 +131,7 @@ public Tuple2 prefixMatch(String word, boolean longestMatch) { } finally { readLock.unlock(); } - return (found == null) ? null : Tuples.of(found.getKey(), found.getValue()); + return (found == null) ? null : Tuples.of(found.key(), found.value()); } @Override @@ -154,7 +154,7 @@ public List> prefixMatchAll(String word, int maximum) { } List> result = new LinkedList<>(); - founds.forEach(find -> result.add(Tuples.of(find.getKey(), find.getValue()))); + founds.forEach(find -> result.add(Tuples.of(find.key(), find.value()))); return result; } @@ -261,7 +261,7 @@ public List> match(String text, boolean longestMatch, boolean oneByOne) if (null != found) { founds.add(found); if (!oneByOne) { - i = found.getEnd(); + i = found.end(); } } } @@ -295,7 +295,7 @@ public List> matchAll(String text, boolean oneByOne, int maximum) { if (!oneByOne && size > 0) { if (founds.getLast() != last) { last = founds.getLast(); - i = last.getEnd(); + i = last.end(); } } } diff --git a/src/main/java/com/igeeksky/xtool/core/nlp/Found.java b/src/main/java/com/igeeksky/xtool/core/nlp/Found.java index 0fd0d58..0826f41 100644 --- a/src/main/java/com/igeeksky/xtool/core/nlp/Found.java +++ b/src/main/java/com/igeeksky/xtool/core/nlp/Found.java @@ -20,99 +20,52 @@ /** * 用于文本段的关键字过滤,返回关键字在文本段中的起止位置 * - * @param 与Node的值类型相同 + * @param 与Node的值类型相同 + * @param begin key 在文本段中的起始位置 + * @param end key 在文本段中的结束位置 + * @param value key 对应的 value * @author Patrick.Lau * @since 0.0.4 2021-10-23 */ -public class Found { - - /** - * key 在文本段中的起始位置 - */ - private final int start; - - /** - * key 在文本段中的结束位置 - */ - private final int end; - - private final String key; - - /** - * key 对应的 value - */ - private final V value; - - public Found(int start, int end, String key, V value) { - this.start = start; - this.end = end; - this.key = key; - this.value = value; - } - - /** - * @return value 在文本中的开始位置 - */ - public int getStart() { - return start; - } - - /** - * @return value 在文本中的结束位置 - */ - public int getEnd() { - return end; - } - - public String getKey() { - return key; - } - - /** - * @return value值 - */ - public V getValue() { - return value; - } +public record Found(int begin, int end, String key, V value) { @Override public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Found)) { + if (!(o instanceof Found found)) { return false; } - Found found = (Found) o; - - if (getStart() != found.getStart()) { + if (begin() != found.begin()) { return false; } - if (getEnd() != found.getEnd()) { + if (end() != found.end()) { return false; } - if (getKey() != null ? !getKey().equals(found.getKey()) : found.getKey() != null) { + if (key() != null ? !key().equals(found.key()) : found.key() != null) { return false; } - return getValue() != null ? getValue().equals(found.getValue()) : found.getValue() == null; + return value() != null ? value().equals(found.value()) : found.value() == null; } @Override public int hashCode() { - int result = getKey() != null ? getKey().hashCode() : 0; - result = 31 * result + getStart(); - result = 31 * result + getEnd(); - result = 31 * result + (getValue() != null ? getValue().hashCode() : 0); + int result = key() != null ? key().hashCode() : 0; + result = 31 * result + begin(); + result = 31 * result + end(); + result = 31 * result + (value() != null ? value().hashCode() : 0); return result; } @Override public String toString() { - return "{\"start\":" + start + + return "{\"begin\":" + begin + ", \"end\":" + end + (null == key ? "" : (", \"key\":\"" + key + "\"")) + (null == value ? "" : (", \"value\":\"" + value + "\"")) + "}"; } + } \ No newline at end of file diff --git a/src/main/java/com/igeeksky/xtool/core/nlp/NodeHelper.java b/src/main/java/com/igeeksky/xtool/core/nlp/NodeHelper.java index 653daa6..ccc591c 100644 --- a/src/main/java/com/igeeksky/xtool/core/nlp/NodeHelper.java +++ b/src/main/java/com/igeeksky/xtool/core/nlp/NodeHelper.java @@ -18,8 +18,8 @@ package com.igeeksky.xtool.core.nlp; -import com.igeeksky.xtool.core.function.tuple.Tuple2; -import com.igeeksky.xtool.core.function.tuple.Tuples; +import com.igeeksky.xtool.core.tuple.Tuple2; +import com.igeeksky.xtool.core.tuple.Tuples; import java.util.Arrays; import java.util.Iterator; diff --git a/src/main/java/com/igeeksky/xtool/core/nlp/Trie.java b/src/main/java/com/igeeksky/xtool/core/nlp/Trie.java index eba10f6..fe0cf05 100644 --- a/src/main/java/com/igeeksky/xtool/core/nlp/Trie.java +++ b/src/main/java/com/igeeksky/xtool/core/nlp/Trie.java @@ -17,7 +17,7 @@ package com.igeeksky.xtool.core.nlp; -import com.igeeksky.xtool.core.function.tuple.Tuple2; +import com.igeeksky.xtool.core.tuple.Tuple2; import java.util.List; import java.util.TreeMap; @@ -235,7 +235,7 @@ public interface Trie { * *

      *     Trie中已有:ab, abc, abcd, abd, bcd
-     *     trie.match("xxabcdexx") == [{"start":2, "end":5, "key":"abcd", "value":"abcd"}, {"start":3, "end":5, "key":"bcd", "value":"bcd"}]
+     *     trie.match("xxabcdexx") == [{"begin":2, "end":5, "key":"abcd", "value":"abcd"}, {"begin":3, "end":5, "key":"bcd", "value":"bcd"}]
      * 
* * @param text 文本段(不为空且长度大于0) @@ -252,16 +252,16 @@ public interface Trie { * Trie中已有:ab, abc, abcd, abd, bcd * * trie.match("xxabcdexx", true, true) == - * [{"start":2, "end":5, "key":"abcd", "value":"abcd"}, {"start":3, "end":5, "key":"bcd", "value":"bcd"}] + * [{"begin":2, "end":5, "key":"abcd", "value":"abcd"}, {"begin":3, "end":5, "key":"bcd", "value":"bcd"}] * * trie.match("xxabcdexx", true, false) == - * [{"start":2, "end":5, "key":"abcd", "value":"abcd"}] + * [{"begin":2, "end":5, "key":"abcd", "value":"abcd"}] * * trie.match("xxabcdexx", false, true) == - * [{"start":2, "end":3, "key":"ab", "value":"ab"}, {"start":3, "end":5, "key":"bcd", "value":"bcd"}] + * [{"begin":2, "end":3, "key":"ab", "value":"ab"}, {"begin":3, "end":5, "key":"bcd", "value":"bcd"}] * * trie.match("xxabcdexx", false, false) == - * [{"start":2, "end":3, "key":"ab", "value":"ab"}] + * [{"begin":2, "end":3, "key":"ab", "value":"ab"}] * * * @param text 文本段(不为空且长度大于0) @@ -290,8 +290,8 @@ public interface Trie { * 例: * Trie中已有:ab, abc, abcd, abd, bcd * trie.matchAll("xxabcdexx") == - * [{"start":2, "end":3, "key":"ab", "value":"ab"}, {"start":2, "end":4, "key":"abc", "value":"abc"}, - * {"start":2, "end":5, "key":"abcd", "value":"abcd"}, {"start":3, "end":5, "key":"bcd", "value":"bcd"}] + * [{"begin":2, "end":3, "key":"ab", "value":"ab"}, {"begin":2, "end":4, "key":"abc", "value":"abc"}, + * {"begin":2, "end":5, "key":"abcd", "value":"abcd"}, {"begin":3, "end":5, "key":"bcd", "value":"bcd"}] * * * @param text 文本段(不为空且长度大于0) @@ -313,16 +313,16 @@ public interface Trie { * Trie中已有:ab, abc, abcd, abd, bcd * * trie.matchAll("xxabcdexx", true, Integer.MAX_VALUE) == - * [{"start":2, "end":3, "key":"ab", "value":"ab"}, {"start":2, "end":4, "key":"abc", "value":"abc"}, - * {"start":2, "end":5, "key":"abcd", "value":"abcd"}, {"start":3, "end":5, "key":"bcd", "value":"bcd"}] + * [{"begin":2, "end":3, "key":"ab", "value":"ab"}, {"begin":2, "end":4, "key":"abc", "value":"abc"}, + * {"begin":2, "end":5, "key":"abcd", "value":"abcd"}, {"begin":3, "end":5, "key":"bcd", "value":"bcd"}] * * trie.matchAll("xxabcdexx", false, Integer.MAX_VALUE) == - * [{"start":2, "end":3, "key":"ab", "value":"ab"}, {"start":2, "end":4, "key":"abc", "value":"abc"}, - * {"start":2, "end":5, "key":"abcd", "value":"abcd"}] + * [{"begin":2, "end":3, "key":"ab", "value":"ab"}, {"begin":2, "end":4, "key":"abc", "value":"abc"}, + * {"begin":2, "end":5, "key":"abcd", "value":"abcd"}] * * - * trie.matchAll("xxabcdexx", true, 1) == [{"start":2, "end":3, "key":"ab", "value":"ab"}] - * trie.matchAll("xxabcdexx", false, 1) == [{"start":2, "end":3, "key":"ab", "value":"ab"}] + * trie.matchAll("xxabcdexx", true, 1) == [{"begin":2, "end":3, "key":"ab", "value":"ab"}] + * trie.matchAll("xxabcdexx", false, 1) == [{"begin":2, "end":3, "key":"ab", "value":"ab"}] * * * diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple.java b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple.java similarity index 95% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple.java rename to src/main/java/com/igeeksky/xtool/core/tuple/Tuple.java index 2404c37..67db90b 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple.java +++ b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple.java @@ -15,7 +15,7 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; import java.util.Iterator; diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple1.java b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple1.java similarity index 86% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple1.java rename to src/main/java/com/igeeksky/xtool/core/tuple/Tuple1.java index 065230f..7060b4f 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple1.java +++ b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple1.java @@ -15,7 +15,9 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; + +import com.igeeksky.xtool.core.lang.ObjectUtils; import java.util.Arrays; import java.util.Objects; @@ -66,20 +68,19 @@ public Object[] toArray() { } @Override - public boolean equals(Object o) { + public final boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Tuple1)) { + if (!(o instanceof Tuple1 tuple1)) { return false; } - Tuple1 tuple1 = (Tuple1) o; - return getT1().equals(tuple1.getT1()); + return ObjectUtils.deepEquals(t1, tuple1.t1); } @Override public int hashCode() { - return getT1().hashCode(); + return ObjectUtils.deepHashCode(t1); } @Override diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple2.java b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple2.java similarity index 86% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple2.java rename to src/main/java/com/igeeksky/xtool/core/tuple/Tuple2.java index c1431c9..2633c35 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple2.java +++ b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple2.java @@ -15,7 +15,9 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; + +import com.igeeksky.xtool.core.lang.ObjectUtils; import java.util.Arrays; import java.util.Objects; @@ -92,22 +94,17 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Tuple2)) { - return false; - } - - Tuple2 tuple2 = (Tuple2) o; - - if (!getT1().equals(tuple2.getT1())) { + if (!(o instanceof Tuple2 tuple2)) { return false; } - return getT2().equals(tuple2.getT2()); + return ObjectUtils.deepEquals(t1, tuple2.t1) + && ObjectUtils.deepEquals(t2, tuple2.t2); } @Override public int hashCode() { - int result = getT1().hashCode(); - result = 31 * result + getT2().hashCode(); + int result = ObjectUtils.deepHashCode(t1); + result = 31 * result + ObjectUtils.deepHashCode(t2); return result; } diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple3.java b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple3.java similarity index 85% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple3.java rename to src/main/java/com/igeeksky/xtool/core/tuple/Tuple3.java index f35c70d..fc7d892 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple3.java +++ b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple3.java @@ -15,7 +15,9 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; + +import com.igeeksky.xtool.core.lang.ObjectUtils; import java.util.Arrays; import java.util.Objects; @@ -114,26 +116,19 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Tuple3)) { - return false; - } - - Tuple3 tuple3 = (Tuple3) o; - - if (!getT1().equals(tuple3.getT1())) { - return false; - } - if (!getT2().equals(tuple3.getT2())) { + if (!(o instanceof Tuple3 tuple3)) { return false; } - return getT3().equals(tuple3.getT3()); + return ObjectUtils.deepEquals(t1, tuple3.t1) + && ObjectUtils.deepEquals(t2, tuple3.t2) + && ObjectUtils.deepEquals(t3, tuple3.t3); } @Override public int hashCode() { - int result = getT1().hashCode(); - result = 31 * result + getT2().hashCode(); - result = 31 * result + getT3().hashCode(); + int result = ObjectUtils.deepHashCode(t1); + result = 31 * result + ObjectUtils.deepHashCode(t2); + result = 31 * result + ObjectUtils.deepHashCode(t3); return result; } diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple4.java b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple4.java similarity index 84% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple4.java rename to src/main/java/com/igeeksky/xtool/core/tuple/Tuple4.java index 327760f..4bd3f6c 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple4.java +++ b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple4.java @@ -15,7 +15,9 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; + +import com.igeeksky.xtool.core.lang.ObjectUtils; import java.util.Arrays; import java.util.Objects; @@ -136,30 +138,21 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Tuple4)) { - return false; - } - - Tuple4 tuple4 = (Tuple4) o; - - if (!getT1().equals(tuple4.getT1())) { - return false; - } - if (!getT2().equals(tuple4.getT2())) { - return false; - } - if (!getT3().equals(tuple4.getT3())) { + if (!(o instanceof Tuple4 tuple4)) { return false; } - return t4.equals(tuple4.t4); + return ObjectUtils.deepEquals(t1, tuple4.t1) + && ObjectUtils.deepEquals(t2, tuple4.t2) + && ObjectUtils.deepEquals(t3, tuple4.t3) + && ObjectUtils.deepEquals(t4, tuple4.t4); } @Override public int hashCode() { - int result = getT1().hashCode(); - result = 31 * result + getT2().hashCode(); - result = 31 * result + getT3().hashCode(); - result = 31 * result + t4.hashCode(); + int result = ObjectUtils.deepHashCode(t1); + result = 31 * result + ObjectUtils.deepHashCode(t2); + result = 31 * result + ObjectUtils.deepHashCode(t3); + result = 31 * result + ObjectUtils.deepHashCode(t4); return result; } diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple5.java b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple5.java similarity index 84% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple5.java rename to src/main/java/com/igeeksky/xtool/core/tuple/Tuple5.java index cd7cc75..fc65017 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuple5.java +++ b/src/main/java/com/igeeksky/xtool/core/tuple/Tuple5.java @@ -15,7 +15,9 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; + +import com.igeeksky.xtool.core.lang.ObjectUtils; import java.util.Arrays; import java.util.Objects; @@ -158,34 +160,23 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Tuple5)) { - return false; - } - - Tuple5 tuple5 = (Tuple5) o; - - if (!getT1().equals(tuple5.getT1())) { - return false; - } - if (!getT2().equals(tuple5.getT2())) { - return false; - } - if (!getT3().equals(tuple5.getT3())) { + if (!(o instanceof Tuple5 tuple5)) { return false; } - if (!getT4().equals(tuple5.getT4())) { - return false; - } - return getT5().equals(tuple5.getT5()); + return ObjectUtils.deepEquals(t1, tuple5.t1) + && ObjectUtils.deepEquals(t2, tuple5.t2) + && ObjectUtils.deepEquals(t3, tuple5.t3) + && ObjectUtils.deepEquals(t4, tuple5.t4) + && ObjectUtils.deepEquals(t5, tuple5.t5); } @Override public int hashCode() { - int result = getT1().hashCode(); - result = 31 * result + getT2().hashCode(); - result = 31 * result + getT3().hashCode(); - result = 31 * result + getT4().hashCode(); - result = 31 * result + getT5().hashCode(); + int result = ObjectUtils.deepHashCode(t1); + result = 31 * result + ObjectUtils.deepHashCode(t2); + result = 31 * result + ObjectUtils.deepHashCode(t3); + result = 31 * result + ObjectUtils.deepHashCode(t4); + result = 31 * result + ObjectUtils.deepHashCode(t5); return result; } @@ -193,4 +184,5 @@ public int hashCode() { public String toString() { return Arrays.toString(toArray()); } + } diff --git a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuples.java b/src/main/java/com/igeeksky/xtool/core/tuple/Tuples.java similarity index 97% rename from src/main/java/com/igeeksky/xtool/core/function/tuple/Tuples.java rename to src/main/java/com/igeeksky/xtool/core/tuple/Tuples.java index e65359e..6fb7714 100644 --- a/src/main/java/com/igeeksky/xtool/core/function/tuple/Tuples.java +++ b/src/main/java/com/igeeksky/xtool/core/tuple/Tuples.java @@ -15,7 +15,7 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; import java.util.Iterator; diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/ExpiryKeyValueTest.java b/src/test/java/com/igeeksky/xtool/core/ExpiryKeyValueTest.java similarity index 99% rename from src/test/java/com/igeeksky/xtool/core/function/tuple/ExpiryKeyValueTest.java rename to src/test/java/com/igeeksky/xtool/core/ExpiryKeyValueTest.java index 6a08177..fa7d039 100644 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/ExpiryKeyValueTest.java +++ b/src/test/java/com/igeeksky/xtool/core/ExpiryKeyValueTest.java @@ -1,4 +1,4 @@ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/com/igeeksky/xtool/core/KeyValueTest.java b/src/test/java/com/igeeksky/xtool/core/KeyValueTest.java new file mode 100644 index 0000000..7a79575 --- /dev/null +++ b/src/test/java/com/igeeksky/xtool/core/KeyValueTest.java @@ -0,0 +1,188 @@ +package com.igeeksky.xtool.core; + + +import com.igeeksky.xtool.core.lang.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * KeyValue 测试类 + * + * @author Patrick.Lau + * @since 1.0.21 + */ +public class KeyValueTest { + + private KeyValue kv0; + private KeyValue kv1; + private KeyValue kv2; + private KeyValue kv3; + private KeyValue kv4; + private KeyValue kv5; + private KeyValue kv6; + private KeyValue kv7; + private KeyValue kv8; + private KeyValue kv9; + private KeyValue kv10; + + @BeforeEach + public void setUp() { + kv0 = KeyValue.create("key", 100); + kv1 = new KeyValue<>("key1", 1); + kv2 = new KeyValue<>("key1", 1); + kv3 = new KeyValue<>("key2", 1); + kv4 = new KeyValue<>("key1", 2); + kv5 = new KeyValue<>(null, null); + kv6 = new KeyValue<>(null, null); + kv7 = new KeyValue<>(null, 1); + kv8 = new KeyValue<>(null, new byte[0]); + kv9 = new KeyValue<>(null, new byte[0]); + kv10 = new KeyValue<>(null, new byte[]{1}); + } + + @Test + public void getKey_ShouldReturnKey() { + assertEquals("key", kv0.getKey()); + } + + @Test + public void getValue_ShouldReturnValue() { + assertEquals(100, kv0.getValue()); + } + + @Test + public void mapKey_ShouldMapKeyCorrectly() { + KeyValue mappedKeyValue = kv0.mapKey(String::length); + assertEquals(3, mappedKeyValue.getKey()); + assertEquals(100, mappedKeyValue.getValue()); + } + + @Test + public void mapValue_ShouldMapValueCorrectly() { + KeyValue mappedKeyValue = kv0.mapValue(value -> String.valueOf(value * 2)); + assertEquals("key", mappedKeyValue.getKey()); + assertEquals("200", mappedKeyValue.getValue()); + } + + @Test + public void map_ShouldMapKeyAndValueCorrectly() { + KeyValue mappedKeyValue = kv0.map( + String::length, + value -> String.valueOf(value * 2) + ); + assertEquals(3, mappedKeyValue.getKey()); + assertEquals("200", mappedKeyValue.getValue()); + } + + @Test + public void hasKey_ShouldReturnTrueWhenKeyIsNotNull() { + assertTrue(kv0.hasKey()); + } + + @Test + public void hasKey_ShouldReturnFalseWhenKeyIsNull() { + KeyValue emptyKeyValue = KeyValue.empty(); + assertFalse(emptyKeyValue.hasKey()); + } + + @Test + public void hasValue_ShouldReturnTrueWhenValueIsNotNull() { + assertTrue(kv0.hasValue()); + } + + @Test + public void hasValue_ShouldReturnFalseWhenValueIsNull() { + KeyValue emptyKeyValue = KeyValue.empty(); + assertFalse(emptyKeyValue.hasValue()); + } + + @Test + public void empty_ShouldReturnEmptyKeyValue() { + KeyValue emptyKeyValue = KeyValue.empty(); + assertNull(emptyKeyValue.getKey()); + assertNull(emptyKeyValue.getValue()); + } + + @Test + public void create_ShouldCreateKeyValueWithGivenKeyAndValue() { + KeyValue createdKeyValue = KeyValue.create("newKey", 200); + assertEquals("newKey", createdKeyValue.getKey()); + assertEquals(200, createdKeyValue.getValue()); + } + + @Test + public void equals_ShouldReturnTrueForEqualKeyValue() { + KeyValue anotherKeyValue = KeyValue.create("key", 100); + assertEquals(kv0, anotherKeyValue); + } + + @Test + public void equals_ShouldReturnFalseForDifferentKeyValue() { + KeyValue differentKeyValue = KeyValue.create("anotherKey", 200); + assertNotEquals(kv0, differentKeyValue); + } + + @Test + public void hashCode_ShouldReturnConsistentHashCode() { + int hashCode = kv0.hashCode(); + assertEquals(hashCode, kv0.hashCode()); + } + + @Test + public void toString_ShouldReturnCorrectStringRepresentation() { + assertEquals("{\"key\":\"key\", \"value\":100}", kv0.toString()); + } + + @Test + public void equals_NullObject_ReturnsTrue() { + Assert.isFalse(kv1.equals(null)); + } + + @Test + public void equals_SameObject_ReturnsTrue() { + Assert.isTrue(kv1.equals(kv1)); + } + + @Test + public void equals_DifferentType_ReturnsFalse() { + Assert.isFalse(kv1.equals(Pair.create("key", 1))); + } + + @Test + public void equals_SameKeyValue_ReturnsTrue() { + Assert.isTrue(kv1.equals(kv2)); + } + + @Test + public void equals_DifferentKey_ReturnsFalse() { + Assert.isFalse(kv1.equals(kv3)); + } + + @Test + public void equals_DifferentValue_ReturnsFalse() { + Assert.isFalse(kv1.equals(kv4)); + } + + @Test + public void equals_NullValues_ReturnsTrue() { + Assert.isTrue(kv5.equals(kv6)); + } + + @Test + public void equals_OneNullValue_ReturnsFalse() { + Assert.isFalse(kv5.equals(kv7)); + } + + @Test + public void equals_byteArrayValue_ReturnsTrue() { + Assert.isTrue(kv8.equals(kv9)); + } + + @Test + public void equals_byteArrayValue_ReturnsFalse() { + Assert.isFalse(kv8.equals(kv10)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/PairTest.java b/src/test/java/com/igeeksky/xtool/core/PairTest.java similarity index 62% rename from src/test/java/com/igeeksky/xtool/core/function/tuple/PairTest.java rename to src/test/java/com/igeeksky/xtool/core/PairTest.java index d5cb37e..14d0f92 100644 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/PairTest.java +++ b/src/test/java/com/igeeksky/xtool/core/PairTest.java @@ -15,8 +15,9 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core; +import com.igeeksky.xtool.core.tuple.Tuples; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -26,82 +27,96 @@ */ public class PairTest { + @Test + public void create() { + Pair pair = Pair.create("key", "value"); + Assertions.assertEquals("key", pair.key()); + Assertions.assertEquals("value", pair.value()); + } + + @Test + public void emptyPair() { + Pair pair = Pair.emptyPair(); + Assertions.assertNull(pair.key()); + Assertions.assertNull(pair.value()); + } + @Test public void getKey() { - Pair pair = Pairs.of("key", "value"); + Pair pair = Pair.create("key", "value"); Assertions.assertEquals("key", pair.key()); } @Test public void getValue() { - Pair pair = Pairs.of("key", "value"); + Pair pair = Pair.create("key", "value"); Assertions.assertEquals("value", pair.value()); } @Test public void hasValue() { - Pair pair = Pairs.of("key", "value"); + Pair pair = Pair.create("key", "value"); Assertions.assertTrue(pair.hasValue()); } @Test public void testHasValue() { - Pair pair = Pairs.emptyPair(); + Pair pair = Pair.emptyPair(); Assertions.assertFalse(pair.hasValue()); } @Test public void testEquals() { - Pair pair = Pairs.emptyPair(); - Pair pair2 = Pairs.emptyPair(); + Pair pair = Pair.emptyPair(); + Pair pair2 = Pair.emptyPair(); Assertions.assertEquals(pair, pair2); } @Test public void testEquals2() { - Pair pair = Pairs.of("key", "value"); - Pair pair2 = Pairs.emptyPair(); + Pair pair = Pair.create("key", "value"); + Pair pair2 = Pair.emptyPair(); Assertions.assertNotEquals(pair, pair2); Assertions.assertNotEquals(pair, Tuples.of("key", "value")); } @Test public void testEquals3() { - Pair, Pair> pair = Pairs.of(Pairs.of("key", "value"), Pairs.of("key", "value")); - Pair, Pair> pair2 = Pairs.of(Pairs.of("key", "value"), Pairs.of("key", "value")); + Pair, Pair> pair = Pair.create(Pair.create("key", "value"), Pair.create("key", "value")); + Pair, Pair> pair2 = Pair.create(Pair.create("key", "value"), Pair.create("key", "value")); Assertions.assertEquals(pair, pair2); } @Test public void hashcode() { - Pair pair = Pairs.of("key", "value"); - Pair pair2 = Pairs.emptyPair(); + Pair pair = Pair.create("key", "value"); + Pair pair2 = Pair.emptyPair(); Assertions.assertNotEquals(pair.hashCode(), pair2.hashCode()); } @Test public void testToString() { - Pair, Pair> pair = Pairs.of(Pairs.of("key", "value"), Pairs.of("key", "value")); + Pair, Pair> pair = Pair.create(Pair.create("key", "value"), Pair.create("key", "value")); Assertions.assertEquals("{\"key\":{\"key\":\"key\", \"value\":\"value\"}, \"value\":{\"key\":\"key\", \"value\":\"value\"}}", pair.toString()); } @Test public void mapKey() { - Pair pair = Pairs.of("key", "value"); + Pair pair = Pair.create("key", "value"); Pair newPair = pair.mapKey((k) -> 1); Assertions.assertEquals(Integer.valueOf(1), newPair.key()); } @Test public void mapValue() { - Pair pair = Pairs.of("key", "value"); + Pair pair = Pair.create("key", "value"); Pair newPair = pair.mapValue((k) -> 1); Assertions.assertEquals(Integer.valueOf(1), newPair.value()); } @Test public void hasKey() { - Pair pair = Pairs.of("key", "value"); + Pair pair = Pair.create("key", "value"); Assertions.assertTrue(pair.hasKey()); } } \ No newline at end of file diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/KeyValueTest.java b/src/test/java/com/igeeksky/xtool/core/function/tuple/KeyValueTest.java deleted file mode 100644 index c0e0904..0000000 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/KeyValueTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.igeeksky.xtool.core.function.tuple; - - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * KeyValue 测试类 - * - * @author Patrick.Lau - * @since 1.0.21 - */ -public class KeyValueTest { - - private KeyValue keyValue; - - @BeforeEach - public void setUp() { - keyValue = KeyValue.create("key", 100); - } - - @Test - public void getKey_ShouldReturnKey() { - assertEquals("key", keyValue.getKey()); - } - - @Test - public void getValue_ShouldReturnValue() { - assertEquals(100, keyValue.getValue()); - } - - @Test - public void mapKey_ShouldMapKeyCorrectly() { - KeyValue mappedKeyValue = keyValue.mapKey(String::length); - assertEquals(3, mappedKeyValue.getKey()); - assertEquals(100, mappedKeyValue.getValue()); - } - - @Test - public void mapValue_ShouldMapValueCorrectly() { - KeyValue mappedKeyValue = keyValue.mapValue(value -> String.valueOf(value * 2)); - assertEquals("key", mappedKeyValue.getKey()); - assertEquals("200", mappedKeyValue.getValue()); - } - - @Test - public void map_ShouldMapKeyAndValueCorrectly() { - KeyValue mappedKeyValue = keyValue.map( - String::length, - value -> String.valueOf(value * 2) - ); - assertEquals(3, mappedKeyValue.getKey()); - assertEquals("200", mappedKeyValue.getValue()); - } - - @Test - public void hasKey_ShouldReturnTrueWhenKeyIsNotNull() { - assertTrue(keyValue.hasKey()); - } - - @Test - public void hasKey_ShouldReturnFalseWhenKeyIsNull() { - KeyValue emptyKeyValue = KeyValue.empty(); - assertFalse(emptyKeyValue.hasKey()); - } - - @Test - public void hasValue_ShouldReturnTrueWhenValueIsNotNull() { - assertTrue(keyValue.hasValue()); - } - - @Test - public void hasValue_ShouldReturnFalseWhenValueIsNull() { - KeyValue emptyKeyValue = KeyValue.empty(); - assertFalse(emptyKeyValue.hasValue()); - } - - @Test - public void empty_ShouldReturnEmptyKeyValue() { - KeyValue emptyKeyValue = KeyValue.empty(); - assertNull(emptyKeyValue.getKey()); - assertNull(emptyKeyValue.getValue()); - } - - @Test - public void create_ShouldCreateKeyValueWithGivenKeyAndValue() { - KeyValue createdKeyValue = KeyValue.create("newKey", 200); - assertEquals("newKey", createdKeyValue.getKey()); - assertEquals(200, createdKeyValue.getValue()); - } - - @Test - public void equals_ShouldReturnTrueForEqualKeyValue() { - KeyValue anotherKeyValue = KeyValue.create("key", 100); - assertEquals(keyValue, anotherKeyValue); - } - - @Test - public void equals_ShouldReturnFalseForDifferentKeyValue() { - KeyValue differentKeyValue = KeyValue.create("anotherKey", 200); - assertNotEquals(keyValue, differentKeyValue); - } - - @Test - public void hashCode_ShouldReturnConsistentHashCode() { - int hashCode = keyValue.hashCode(); - assertEquals(hashCode, keyValue.hashCode()); - } - - @Test - public void toString_ShouldReturnCorrectStringRepresentation() { - assertEquals("{\"key\":\"key\", \"value\":100}", keyValue.toString()); - } - -} \ No newline at end of file diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/PairsTest.java b/src/test/java/com/igeeksky/xtool/core/function/tuple/PairsTest.java deleted file mode 100644 index ca45818..0000000 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/PairsTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2021 Patrick.lau All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.igeeksky.xtool.core.function.tuple; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -/** - * @author Patrick.Lau - * @since 1.0.1 2021-11-20 - */ -public class PairsTest { - - @Test - public void of() { - Pair pair = Pairs.of("key", "value"); - Assertions.assertEquals("key", pair.key()); - Assertions.assertEquals("value", pair.value()); - } - - @Test - public void emptyPair() { - Pair pair = Pairs.emptyPair(); - Assertions.assertNull(pair.key()); - Assertions.assertNull(pair.value()); - } -} \ No newline at end of file diff --git a/src/test/java/com/igeeksky/xtool/core/lang/ObjectUtilsTest.java b/src/test/java/com/igeeksky/xtool/core/lang/ObjectUtilsTest.java new file mode 100644 index 0000000..3b1e9b5 --- /dev/null +++ b/src/test/java/com/igeeksky/xtool/core/lang/ObjectUtilsTest.java @@ -0,0 +1,247 @@ +package com.igeeksky.xtool.core.lang; + + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +public class ObjectUtilsTest { + + @Test + public void deepHashCode_NullObject_ReturnsZero() { + assertEquals(0, ObjectUtils.deepHashCode(null)); + } + + @Test + public void deepHashCode_NonArrayObject_ReturnsHashCode() { + Object obj = new Object(); + assertEquals(obj.hashCode(), ObjectUtils.deepHashCode(obj)); + } + + @Test + public void deepHashCode_EmptyArrayObject_ReturnsHashCode() { + Object[] objArray = new Object[0]; + assertEquals(Arrays.hashCode(objArray), ObjectUtils.deepHashCode(objArray)); + } + + @Test + public void deepHashcode_ObjectArray_ReturnsDeepHashCode() { + Object[] objArray = {new Object(), new Object()}; + assertEquals(Arrays.deepHashCode(objArray), ObjectUtils.deepHashCode(objArray)); + } + + @Test + public void deepHashCode_PrimitiveByteArray_ReturnsHashCode() { + byte[] byteArray = {1, 2, 3}; + assertEquals(Arrays.hashCode(byteArray), ObjectUtils.deepHashCode(byteArray)); + } + + @Test + public void deepHashCode_PrimitiveIntArray_ReturnsHashCode() { + int[] intArray = {1, 2, 3}; + assertEquals(Arrays.hashCode(intArray), ObjectUtils.deepHashCode(intArray)); + } + + @Test + public void deepHashCode_PrimitiveLongArray_ReturnsHashCode() { + long[] longArray = {1L, 2L, 3L}; + assertEquals(Arrays.hashCode(longArray), ObjectUtils.deepHashCode(longArray)); + } + + @Test + public void deepHashCode_PrimitiveCharArray_ReturnsHashCode() { + char[] charArray = {'a', 'b', 'c'}; + assertEquals(Arrays.hashCode(charArray), ObjectUtils.deepHashCode(charArray)); + } + + @Test + public void deepHashCode_PrimitiveShortArray_ReturnsHashCode() { + short[] shortArray = {1, 2, 3}; + assertEquals(Arrays.hashCode(shortArray), ObjectUtils.deepHashCode(shortArray)); + } + + @Test + public void deepHashCode_PrimitiveBooleanArray_ReturnsHashCode() { + boolean[] booleanArray = {true, false, true}; + assertEquals(Arrays.hashCode(booleanArray), ObjectUtils.deepHashCode(booleanArray)); + } + + @Test + public void deepHashCode_PrimitiveDoubleArray_ReturnsHashCode() { + double[] doubleArray = {1.0, 2.0, 3.0}; + assertEquals(Arrays.hashCode(doubleArray), ObjectUtils.deepHashCode(doubleArray)); + } + + @Test + public void deepHashCode_PrimitiveFloatArray_ReturnsHashCode() { + float[] floatArray = {1.0f, 2.0f, 3.0f}; + assertEquals(Arrays.hashCode(floatArray), ObjectUtils.deepHashCode(floatArray)); + } + + @Test + public void deepEquals_SameReference_ReturnsTrue() { + Object obj = new Object(); + assertTrue(ObjectUtils.deepEquals(obj, obj)); + } + + @Test + public void deepEquals_OneNull_ReturnsFalse() { + Object obj = new Object(); + assertFalse(ObjectUtils.deepEquals(obj, null)); + assertFalse(ObjectUtils.deepEquals(null, obj)); + } + + @Test + public void deepEquals_BothNull_ReturnsTrue() { + assertTrue(ObjectUtils.deepEquals(null, null)); + } + + @Test + public void deepEquals_EqualObj_ReturnsTrue() { + String str1 = new String("a".getBytes()); + String str2 = new String("a".getBytes()); + assertTrue(ObjectUtils.deepEquals(str1, str2)); + } + + @Test + public void deepEquals_DifferentObjects_ReturnsFalse() { + Object obj1 = new Object(); + Object obj2 = new Object(); + assertFalse(ObjectUtils.deepEquals(obj1, obj2)); + } + + @Test + public void deepEquals_DifferentObjectArrays_ReturnsFalse() { + Object[] objArray1 = {new Object(), new Object()}; + Object[] objArray2 = {new Object(), new Object()}; + assertFalse(ObjectUtils.deepEquals(objArray1, objArray2)); + } + + @Test + public void deepEquals_EqualPrimitiveArrays_ReturnsTrue() { + int[] intArray1 = {1, 2, 3}; + int[] intArray2 = {1, 2, 3}; + assertTrue(ObjectUtils.deepEquals(intArray1, intArray2)); + } + + @Test + public void deepEquals_DifferentPrimitiveArrays_ReturnsFalse() { + int[] intArray1 = {1, 2, 3}; + int[] intArray2 = {3, 2, 1}; + assertFalse(ObjectUtils.deepEquals(intArray1, intArray2)); + } + + @Test + public void deepEquals_EqualByteArrays_ReturnsTrue() { + byte[] array1 = {1, 2, 3}; + byte[] array2 = {1, 2, 3}; + assertTrue(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_DifferentByteArrays_ReturnsFalse() { + byte[] array1 = {1, 2, 3}; + byte[] array2 = {3, 2, 1}; + assertFalse(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_EqualLongArrays_ReturnsTrue() { + long[] array1 = {1, 2, 3}; + long[] array2 = {1, 2, 3}; + assertTrue(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_DifferentLongArrays_ReturnsFalse() { + long[] array1 = {1, 2, 3}; + long[] array2 = {3, 2, 1}; + assertFalse(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_EqualCharArrays_ReturnsTrue() { + char[] array1 = {1, 2, 3}; + char[] array2 = {1, 2, 3}; + assertTrue(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_DifferentCharArrays_ReturnsFalse() { + char[] array1 = {1, 2, 3}; + char[] array2 = {3, 2, 1}; + assertFalse(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_EqualShortArrays_ReturnsTrue() { + short[] array1 = {1, 2, 3}; + short[] array2 = {1, 2, 3}; + assertTrue(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_DifferentShortArrays_ReturnsFalse() { + short[] array1 = {1, 2, 3}; + short[] array2 = {3, 2, 1}; + assertFalse(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_EqualDoubleArrays_ReturnsTrue() { + double[] array1 = {1, 2, 3}; + double[] array2 = {1, 2, 3}; + assertTrue(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_DifferentDoubleArrays_ReturnsFalse() { + double[] array1 = {1, 2, 3}; + double[] array2 = {3, 2, 1}; + assertFalse(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_EqualFloatArrays_ReturnsTrue() { + float[] array1 = {1, 2, 3}; + float[] array2 = {1, 2, 3}; + assertTrue(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_DifferentFloatArrays_ReturnsFalse() { + float[] array1 = {1, 2, 3}; + float[] array2 = {3, 2, 1}; + assertFalse(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_EqualBooleanArrays_ReturnsTrue() { + boolean[] array1 = {true, false, true}; + boolean[] array2 = {true, false, true}; + assertTrue(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_DifferentBooleanArrays_ReturnsFalse() { + boolean[] array1 = {false, true, false}; + boolean[] array2 = {true, false, true}; + assertFalse(ObjectUtils.deepEquals(array1, array2)); + } + + @Test + public void deepEquals_DifferentArrayTypes_ReturnsFalse() { + Object[] objArray = {new Object(), new Object()}; + int[] intArray = {1, 2}; + assertFalse(ObjectUtils.deepEquals(objArray, intArray)); + } + + @Test + public void deepEquals_MixedArrayTypes_ReturnsFalse() { + Object[] objArray = {new Object(), new Object()}; + Object[] mixedArray = {new Object(), 1}; + assertFalse(ObjectUtils.deepEquals(objArray, mixedArray)); + } +} diff --git a/src/test/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrie2Test.java b/src/test/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrie2Test.java index a6beb82..c39f7b2 100644 --- a/src/test/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrie2Test.java +++ b/src/test/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrie2Test.java @@ -17,8 +17,8 @@ package com.igeeksky.xtool.core.nlp; -import com.igeeksky.xtool.core.function.tuple.Tuple2; -import com.igeeksky.xtool.core.function.tuple.Tuples; +import com.igeeksky.xtool.core.tuple.Tuple2; +import com.igeeksky.xtool.core.tuple.Tuples; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -277,11 +277,11 @@ public void match() { String text = "为什么不准发布?敏感词真敏感!"; List> match = trie.match(text); - Assertions.assertEquals("[{\"start\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"start\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", match.toString()); + Assertions.assertEquals("[{\"begin\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"begin\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", match.toString()); // match 与 matchAll 对比,起始位置 8:contains只返回“敏感”;matchAll 返回了“敏感”和“敏感词”; List> matchAll = trie.matchAll(text); - Assertions.assertEquals("[{\"start\":8, \"end\":9, \"key\":\"敏感\", \"value\":\"敏感\"}, {\"start\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"start\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", matchAll.toString()); + Assertions.assertEquals("[{\"begin\":8, \"end\":9, \"key\":\"敏感\", \"value\":\"敏感\"}, {\"begin\":8, \"end\":10, \"key\":\"敏感词\", \"value\":\"敏感词\"}, {\"begin\":12, \"end\":13, \"key\":\"敏感\", \"value\":\"敏感\"}]", matchAll.toString()); } @@ -298,46 +298,46 @@ public void matchAndMatchAll() { // match 与 matchAll 对比 List> match = trie.match("xxabcdexx"); - Assertions.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); List> matchAll = trie.matchAll("xxabcdexx"); - Assertions.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString()); // match 参数变化对比 // 最长匹配;逐字符扫描 match = trie.match("xxabcdexx", true, true); - Assertions.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); // 最长匹配;跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配 match = trie.match("xxabcdexx", true, false); - Assertions.assertEquals("[{\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", match.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", match.toString()); // 最短匹配;逐字符扫描 match = trie.match("xxabcdexx", false, true); - Assertions.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", match.toString()); // 最短匹配;跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配 match = trie.match("xxabcdexx", false, false); - Assertions.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", match.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", match.toString()); // matchAll 参数变化对比 // 逐字符扫描;最大返回数量为Integer.MAX_VALUE matchAll = trie.matchAll("xxabcdexx", true, Integer.MAX_VALUE); - Assertions.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"start\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}, {\"begin\":3, \"end\":5, \"key\":\"bcd\", \"value\":\"bcd\"}]", matchAll.toString()); // 跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配;最大返回数量为Integer.MAX_VALUE matchAll = trie.matchAll("xxabcdexx", false, Integer.MAX_VALUE); - Assertions.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"start\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", matchAll.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":4, \"key\":\"abc\", \"value\":\"abc\"}, {\"begin\":2, \"end\":5, \"key\":\"abcd\", \"value\":\"abcd\"}]", matchAll.toString()); // 逐字符扫描;最大返回数量为1 matchAll = trie.matchAll("xxabcdexx", true, 1); - Assertions.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString()); // 跳过已匹配到的词,跳到已匹配到的词的下标 + 1 开始匹配;最大返回数量为1 matchAll = trie.matchAll("xxabcdexx", false, 1); - Assertions.assertEquals("[{\"start\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString()); + Assertions.assertEquals("[{\"begin\":2, \"end\":3, \"key\":\"ab\", \"value\":\"ab\"}]", matchAll.toString()); } @Test diff --git a/src/test/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrieTest.java b/src/test/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrieTest.java index 8e2f650..4e95de4 100644 --- a/src/test/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrieTest.java +++ b/src/test/java/com/igeeksky/xtool/core/nlp/ConcurrentHashTrieTest.java @@ -17,8 +17,8 @@ package com.igeeksky.xtool.core.nlp; -import com.igeeksky.xtool.core.function.tuple.Tuple2; -import com.igeeksky.xtool.core.function.tuple.Tuples; +import com.igeeksky.xtool.core.tuple.Tuple2; +import com.igeeksky.xtool.core.tuple.Tuples; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -327,7 +327,7 @@ public void match() { List> shortMatches = trie.match("abcdefg"); System.out.println(shortMatches); - String expected = "[{\"start\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":1, \"end\":2, \"key\":\"bc\", \"value\":\"bc\"}, {\"start\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"start\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; + String expected = "[{\"begin\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":1, \"end\":2, \"key\":\"bc\", \"value\":\"bc\"}, {\"begin\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"begin\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; Assertions.assertEquals(expected, shortMatches.toString()); @@ -338,19 +338,19 @@ public void match() { List> longMatches = trie.match("abcdefg", true, true); System.out.println(longMatches); - expected = "[{\"start\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":1, \"end\":2, \"key\":\"bc\", \"value\":\"bc\"}, {\"start\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"start\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; + expected = "[{\"begin\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":1, \"end\":2, \"key\":\"bc\", \"value\":\"bc\"}, {\"begin\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"begin\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; Assertions.assertEquals(expected, longMatches.toString()); List> skipMatches2 = trie.match("abcdefg", false, false); System.out.println(skipMatches2); - expected = "[{\"start\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"start\":4, \"end\":5, \"key\":\"ef\", \"value\":\"ef\"}]"; + expected = "[{\"begin\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"begin\":4, \"end\":5, \"key\":\"ef\", \"value\":\"ef\"}]"; Assertions.assertEquals(expected, skipMatches2.toString()); List> skipMatches = trie.match("abcdefg", true, false); System.out.println(skipMatches); - expected = "[{\"start\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"start\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; + expected = "[{\"begin\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"begin\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; Assertions.assertEquals(expected, skipMatches.toString()); } @@ -370,7 +370,7 @@ public void matchAll() { List> shortMatches = trie.matchAll("abcdefg"); System.out.println(shortMatches); - String expected = "[{\"start\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":1, \"end\":2, \"key\":\"bc\", \"value\":\"bc\"}, {\"start\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"start\":4, \"end\":5, \"key\":\"ef\", \"value\":\"ef\"}, {\"start\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; + String expected = "[{\"begin\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":1, \"end\":2, \"key\":\"bc\", \"value\":\"bc\"}, {\"begin\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"begin\":4, \"end\":5, \"key\":\"ef\", \"value\":\"ef\"}, {\"begin\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; Assertions.assertEquals(expected, shortMatches.toString()); @@ -381,12 +381,12 @@ public void matchAll() { List> shortMatches2 = trie.matchAll("abcdefg", false, Integer.MAX_VALUE); System.out.println(shortMatches2); - expected = "[{\"start\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"start\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"start\":4, \"end\":5, \"key\":\"ef\", \"value\":\"ef\"}, {\"start\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; + expected = "[{\"begin\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}, {\"begin\":2, \"end\":3, \"key\":\"cd\", \"value\":\"cd\"}, {\"begin\":4, \"end\":5, \"key\":\"ef\", \"value\":\"ef\"}, {\"begin\":4, \"end\":6, \"key\":\"efg\", \"value\":\"efg\"}]"; Assertions.assertEquals(expected, shortMatches2.toString()); List> shortMatches3 = trie.matchAll("abcdefg", false, 1); System.out.println(shortMatches3); - expected = "[{\"start\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}]"; + expected = "[{\"begin\":0, \"end\":1, \"key\":\"ab\", \"value\":\"ab\"}]"; Assertions.assertEquals(expected, shortMatches3.toString()); } diff --git a/src/test/java/com/igeeksky/xtool/core/nlp/FoundTest.java b/src/test/java/com/igeeksky/xtool/core/nlp/FoundTest.java index 2a2f4e1..6ecd763 100644 --- a/src/test/java/com/igeeksky/xtool/core/nlp/FoundTest.java +++ b/src/test/java/com/igeeksky/xtool/core/nlp/FoundTest.java @@ -29,13 +29,13 @@ public class FoundTest { @Test public void getStart() { Found found = new Found<>(0, 2, null, "ac"); - Assertions.assertEquals(0, found.getStart()); + Assertions.assertEquals(0, found.begin()); } @Test public void getEnd() { Found found = new Found<>(0, 2, null, "ac"); - Assertions.assertEquals(2, found.getEnd()); + Assertions.assertEquals(2, found.end()); } @Test diff --git a/src/test/java/com/igeeksky/xtool/core/nlp/NodeTest.java b/src/test/java/com/igeeksky/xtool/core/nlp/NodeTest.java index e59bf5f..a9b4b7e 100644 --- a/src/test/java/com/igeeksky/xtool/core/nlp/NodeTest.java +++ b/src/test/java/com/igeeksky/xtool/core/nlp/NodeTest.java @@ -17,8 +17,8 @@ package com.igeeksky.xtool.core.nlp; -import com.igeeksky.xtool.core.function.tuple.Tuple2; -import com.igeeksky.xtool.core.function.tuple.Tuples; +import com.igeeksky.xtool.core.tuple.Tuple2; +import com.igeeksky.xtool.core.tuple.Tuples; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple1Test.java b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple1Test.java similarity index 97% rename from src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple1Test.java rename to src/test/java/com/igeeksky/xtool/core/tuple/Tuple1Test.java index 78c8b88..2a5bf1f 100644 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple1Test.java +++ b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple1Test.java @@ -15,7 +15,7 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple2Test.java b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple2Test.java similarity index 98% rename from src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple2Test.java rename to src/test/java/com/igeeksky/xtool/core/tuple/Tuple2Test.java index ceb7717..03e67cd 100644 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple2Test.java +++ b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple2Test.java @@ -15,7 +15,7 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple3Test.java b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple3Test.java similarity index 98% rename from src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple3Test.java rename to src/test/java/com/igeeksky/xtool/core/tuple/Tuple3Test.java index 04d37bf..0943059 100644 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple3Test.java +++ b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple3Test.java @@ -15,7 +15,7 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple4Test.java b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple4Test.java similarity index 98% rename from src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple4Test.java rename to src/test/java/com/igeeksky/xtool/core/tuple/Tuple4Test.java index dc9ae9d..51e064b 100644 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple4Test.java +++ b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple4Test.java @@ -15,7 +15,7 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple5Test.java b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple5Test.java similarity index 98% rename from src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple5Test.java rename to src/test/java/com/igeeksky/xtool/core/tuple/Tuple5Test.java index d7819f5..84418d5 100644 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/Tuple5Test.java +++ b/src/test/java/com/igeeksky/xtool/core/tuple/Tuple5Test.java @@ -15,7 +15,7 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/igeeksky/xtool/core/function/tuple/TupleTest.java b/src/test/java/com/igeeksky/xtool/core/tuple/TupleTest.java similarity index 95% rename from src/test/java/com/igeeksky/xtool/core/function/tuple/TupleTest.java rename to src/test/java/com/igeeksky/xtool/core/tuple/TupleTest.java index 9d40e62..f6706eb 100644 --- a/src/test/java/com/igeeksky/xtool/core/function/tuple/TupleTest.java +++ b/src/test/java/com/igeeksky/xtool/core/tuple/TupleTest.java @@ -15,7 +15,7 @@ */ -package com.igeeksky.xtool.core.function.tuple; +package com.igeeksky.xtool.core.tuple; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test;