From c43c37c923ab08e7b6b6707b08b7dcedd3cdd408 Mon Sep 17 00:00:00 2001 From: eeemt Date: Fri, 7 Aug 2020 16:18:28 +0800 Subject: [PATCH] fix: 1300000xxxx can not be found; optimize: unit test --- CHANGLOG | 6 ++++- pom.xml | 2 +- .../AnotherBinarySearchAlgorithmImpl.java | 17 +++++++++++++ .../algorithm/BinarySearchAlgorithmImpl.java | 24 +++++++++---------- .../ProspectBinarySearchAlgorithmImpl.java | 23 +++++++++--------- .../pna/PhoneNumberLookupAlgorithmTest.java | 4 ++-- 6 files changed, 47 insertions(+), 29 deletions(-) diff --git a/CHANGLOG b/CHANGLOG index 933f74a..de49535 100644 --- a/CHANGLOG +++ b/CHANGLOG @@ -35,4 +35,8 @@ ## 1.0.6-202004 - 修复一个bug https://github.com/EeeMt/phone-number-geo/issues/1 -- 优化单元测试 \ No newline at end of file +- 优化单元测试 + +## 1.0.7-202004 +- 修复1300000xxxx无法查询的问题 +- 修复单元测试缺陷 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 82131dd..8e402d6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.ihxq.projects phone-number-geo - 1.0.6-202004 + 1.0.7-202004 jar phone-number-geo https://github.com/EeeMt/phone-number-geo diff --git a/src/main/java/me/ihxq/projects/pna/algorithm/AnotherBinarySearchAlgorithmImpl.java b/src/main/java/me/ihxq/projects/pna/algorithm/AnotherBinarySearchAlgorithmImpl.java index 9e65bc2..01f6ee6 100644 --- a/src/main/java/me/ihxq/projects/pna/algorithm/AnotherBinarySearchAlgorithmImpl.java +++ b/src/main/java/me/ihxq/projects/pna/algorithm/AnotherBinarySearchAlgorithmImpl.java @@ -30,6 +30,20 @@ public void loadData(byte[] data) { indicesEndOffset = originalByteBuffer.limit(); } + /** + * 对齐 + */ + private int alignPosition(int pos) { + int remain = (pos - indicesStartOffset) % 9; + if (pos - indicesStartOffset < 9) { + return pos - remain; + } else if (remain != 0) { + return pos + 9 - remain; + } else { + return pos; + } + } + @SuppressWarnings("DuplicatedCode") @Override public Optional lookup(String phoneNo) { @@ -56,6 +70,7 @@ public Optional lookup(String phoneNo) { int left = indicesStartOffset; int right = indicesEndOffset; int mid = (left + right) / 2; + mid = alignPosition(mid); while (mid >= left && mid <= right) { if (mid == right) { return Optional.empty(); @@ -70,6 +85,7 @@ public Optional lookup(String phoneNo) { if (compare > 0) { int tempMid = (mid + left) / 2; + tempMid = alignPosition(tempMid); right = mid; int remain = (tempMid - indicesStartOffset) % 9; if (tempMid - indicesStartOffset < 9) { @@ -83,6 +99,7 @@ public Optional lookup(String phoneNo) { } } else { int tempMid = (mid + right) / 2; + tempMid = alignPosition(tempMid); left = mid; int remain = (tempMid - indicesStartOffset) % 9; if (tempMid - indicesStartOffset < 9) { diff --git a/src/main/java/me/ihxq/projects/pna/algorithm/BinarySearchAlgorithmImpl.java b/src/main/java/me/ihxq/projects/pna/algorithm/BinarySearchAlgorithmImpl.java index e1b9f47..b93c377 100644 --- a/src/main/java/me/ihxq/projects/pna/algorithm/BinarySearchAlgorithmImpl.java +++ b/src/main/java/me/ihxq/projects/pna/algorithm/BinarySearchAlgorithmImpl.java @@ -36,14 +36,14 @@ public void loadData(byte[] data) { /** * 对齐 */ - private int strictMid(int mid) { - int remain = (mid - indicesStartOffset) % 9; - if (mid - indicesStartOffset < 9) { - return mid - remain; + private int alignPosition(int pos) { + int remain = (pos - indicesStartOffset) % 9; + if (pos - indicesStartOffset < 9) { + return pos - remain; } else if (remain != 0) { - return mid + 9 - remain; + return pos + 9 - remain; } else { - return mid; + return pos; } } @@ -78,26 +78,24 @@ public Optional lookup(String phoneNumber) { int left = indicesStartOffset; int right = indicesEndOffset; int mid = (left + right) / 2; - mid = strictMid(mid); + mid = alignPosition(mid); while (mid >= left && mid <= right) { if (mid == right) { return Optional.empty(); } int compare = compare(mid, attributionIdentity, byteBuffer); - if (mid == left) { - return Optional.empty(); - } - if (compare == 0) { return extract(phoneNumber, mid, byteBuffer); + } else if (mid == left) { + return Optional.empty(); } else if (compare > 0) { int tempMid = (mid + left) / 2; right = mid; - mid = strictMid(tempMid); + mid = alignPosition(tempMid); } else { int tempMid = (mid + right) / 2; left = mid; - mid = strictMid(tempMid); + mid = alignPosition(tempMid); } } return Optional.empty(); diff --git a/src/main/java/me/ihxq/projects/pna/algorithm/ProspectBinarySearchAlgorithmImpl.java b/src/main/java/me/ihxq/projects/pna/algorithm/ProspectBinarySearchAlgorithmImpl.java index 24dc8f7..411a6e0 100644 --- a/src/main/java/me/ihxq/projects/pna/algorithm/ProspectBinarySearchAlgorithmImpl.java +++ b/src/main/java/me/ihxq/projects/pna/algorithm/ProspectBinarySearchAlgorithmImpl.java @@ -36,14 +36,14 @@ public void loadData(byte[] data) { /** * 对齐 */ - private int strictMid(int mid) { - int remain = (mid - indicesStartOffset) % 9; - if (mid - indicesStartOffset < 9) { - return mid - remain; + private int alignPosition(int pos) { + int remain = (pos - indicesStartOffset) % 9; + if (pos - indicesStartOffset < 9) { + return pos - remain; } else if (remain != 0) { - return mid + 9 - remain; + return pos + 9 - remain; } else { - return mid; + return pos; } } @@ -79,26 +79,25 @@ public Optional lookup(String phoneNumber) { int right = indicesEndOffset; int attributionIdentityPrefix = attributionIdentity / 100_000; int mid = indicesStartOffset + ((indicesEndOffset - indicesStartOffset) / 7 * (attributionIdentityPrefix - 13)); - mid = strictMid(mid); + mid = alignPosition(mid); while (mid >= left && mid <= right) { if (mid == right) { return Optional.empty(); } int compare = compare(mid, attributionIdentity, byteBuffer); - if (mid == left) { - return Optional.empty(); - } if (compare == 0) { return extract(phoneNumber, mid, byteBuffer); + } else if (mid == left) { + return Optional.empty(); } else if (compare > 0) { int tempMid = (mid + left) / 2; right = mid; - mid = strictMid(tempMid); + mid = alignPosition(tempMid); } else { int tempMid = (mid + right) / 2; left = mid; - mid = strictMid(tempMid); + mid = alignPosition(tempMid); } } return Optional.empty(); diff --git a/src/test/java/me/ihxq/projects/pna/PhoneNumberLookupAlgorithmTest.java b/src/test/java/me/ihxq/projects/pna/PhoneNumberLookupAlgorithmTest.java index 0de9b06..1f4631e 100644 --- a/src/test/java/me/ihxq/projects/pna/PhoneNumberLookupAlgorithmTest.java +++ b/src/test/java/me/ihxq/projects/pna/PhoneNumberLookupAlgorithmTest.java @@ -84,14 +84,14 @@ public void concurrencyLookup(LookupAlgorithm algorithm) { @MethodSource("algorithms") public void lookupFirst(LookupAlgorithm algorithm) { PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm); - assertNotNull(phoneNumberLookup.lookup("13000000000")); + assertTrue(phoneNumberLookup.lookup("13000000000").isPresent()); } @ParameterizedTest @MethodSource("algorithms") public void lookupLast(LookupAlgorithm algorithm) { PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm); - assertNotNull(phoneNumberLookup.lookup("19999790000")); + assertTrue(phoneNumberLookup.lookup("19999790000").isPresent()); } @ParameterizedTest