From 1ff36a799d06d014f71430e13bdb2fcc0f5bafdd Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Tue, 4 Dec 2018 13:37:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=99=A8=E6=90=9C=E7=B4=A2=E7=AE=97=E6=B3=95BFS(=E5=B9=BF?= =?UTF-8?q?=E5=BA=A6=E4=BC=98=E5=85=88=E6=90=9C=E7=B4=A2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stardust/automator/UiGlobalSelector.kt | 25 +++++++++-- .../java/com/stardust/automator/filter/BFS.kt | 10 ----- .../java/com/stardust/automator/filter/DFS.kt | 42 ------------------ .../java/com/stardust/automator/search/BFS.kt | 32 ++++++++++++++ .../java/com/stardust/automator/search/DFS.kt | 43 +++++++++++++++++++ .../automator/search/SearchAlgorithm.kt | 9 ++++ .../automator/filter/DfsFilterTest.kt | 1 + 7 files changed, 107 insertions(+), 55 deletions(-) delete mode 100644 automator/src/main/java/com/stardust/automator/filter/BFS.kt delete mode 100644 automator/src/main/java/com/stardust/automator/filter/DFS.kt create mode 100644 automator/src/main/java/com/stardust/automator/search/BFS.kt create mode 100644 automator/src/main/java/com/stardust/automator/search/DFS.kt create mode 100644 automator/src/main/java/com/stardust/automator/search/SearchAlgorithm.kt diff --git a/automator/src/main/java/com/stardust/automator/UiGlobalSelector.kt b/automator/src/main/java/com/stardust/automator/UiGlobalSelector.kt index e67b85d3..51758b63 100644 --- a/automator/src/main/java/com/stardust/automator/UiGlobalSelector.kt +++ b/automator/src/main/java/com/stardust/automator/UiGlobalSelector.kt @@ -3,6 +3,10 @@ package com.stardust.automator import android.graphics.Rect import android.os.Build import com.stardust.automator.filter.* +import com.stardust.automator.search.BFS +import com.stardust.automator.search.DFS +import com.stardust.automator.search.SearchAlgorithm +import java.lang.IllegalArgumentException /** * Created by Stardust on 2017/3/8. @@ -11,6 +15,7 @@ import com.stardust.automator.filter.* open class UiGlobalSelector { private val mSelector = Selector() + private var mSearchAlgorithm: SearchAlgorithm = DFS //// 第一类筛选条件 @@ -399,9 +404,6 @@ open class UiGlobalSelector { return findOf(node, Int.MAX_VALUE) } - fun findAndReturnList(node: UiObject, max: Int = Int.MAX_VALUE): List { - return DFS(mSelector, max).search(node) - } fun findOneOf(node: UiObject): UiObject? { val collection = findOf(node, 1) @@ -415,6 +417,23 @@ open class UiGlobalSelector { return this } + fun algorithm(algorithm: String): UiGlobalSelector { + if (algorithm.equals("BFS", true)) { + mSearchAlgorithm = BFS + return this + } + if (algorithm.equals("DFS", true)) { + mSearchAlgorithm = DFS + return this + } + throw IllegalArgumentException("unknown algorithm: $algorithm") + } + + fun findAndReturnList(node: UiObject, max: Int = Int.MAX_VALUE): List { + return mSearchAlgorithm.search(node, mSelector, max) + } + + override fun toString(): String { return mSelector.toString() } diff --git a/automator/src/main/java/com/stardust/automator/filter/BFS.kt b/automator/src/main/java/com/stardust/automator/filter/BFS.kt deleted file mode 100644 index 8258cb0e..00000000 --- a/automator/src/main/java/com/stardust/automator/filter/BFS.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.stardust.automator.filter - -import com.stardust.automator.UiObject - -class BFS(val filter: Filter, val limit: Int = Int.MAX_VALUE) { - - fun search(node: UiObject) { - - } -} \ No newline at end of file diff --git a/automator/src/main/java/com/stardust/automator/filter/DFS.kt b/automator/src/main/java/com/stardust/automator/filter/DFS.kt deleted file mode 100644 index b1fec8dc..00000000 --- a/automator/src/main/java/com/stardust/automator/filter/DFS.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.stardust.automator.filter - -import com.stardust.automator.UiObject - -import java.util.ArrayList - -/** - * Created by Stardust on 2017/3/9. - */ - -class DFS(val filter: Filter, val limit: Int = Int.MAX_VALUE) { - - fun search(node: UiObject): List { - val list = ArrayList() - if (filter.filter(node)) { - list.add(node) - if (list.size >= limit) { - return list - } - } - filterChildren(node, list) - return list - } - - private fun filterChildren(parent: UiObject, list: MutableList) { - for (i in 0 until parent.childCount) { - val child = parent.child(i) ?: continue - val included = filter.filter(child) - if (included) { - list.add(child) - if (list.size >= limit) { - break - } - } - filterChildren(child, list) - if (!included) { - child.recycle() - } - } - } - -} diff --git a/automator/src/main/java/com/stardust/automator/search/BFS.kt b/automator/src/main/java/com/stardust/automator/search/BFS.kt new file mode 100644 index 00000000..9f002b1f --- /dev/null +++ b/automator/src/main/java/com/stardust/automator/search/BFS.kt @@ -0,0 +1,32 @@ +package com.stardust.automator.search + +import com.stardust.automator.UiObject +import com.stardust.automator.filter.Filter +import java.util.* +import kotlin.collections.ArrayList + +object BFS : SearchAlgorithm { + + override fun search(root: UiObject, filter: Filter, limit: Int): ArrayList { + val result = ArrayList() + val queue = ArrayDeque() + queue.add(root) + while (!queue.isEmpty()) { + val top = queue.poll() + val isTarget = filter.filter(top) + if (isTarget) { + result.add(top) + if (result.size > limit) { + return result + } + } + for (i in 0 until top.childCount) { + queue.add(top.child(i) ?: continue) + } + if (!isTarget && top !== root) { + top.recycle() + } + } + return result + } +} \ No newline at end of file diff --git a/automator/src/main/java/com/stardust/automator/search/DFS.kt b/automator/src/main/java/com/stardust/automator/search/DFS.kt new file mode 100644 index 00000000..6f7efdd8 --- /dev/null +++ b/automator/src/main/java/com/stardust/automator/search/DFS.kt @@ -0,0 +1,43 @@ +package com.stardust.automator.search + +import com.stardust.automator.UiObject +import com.stardust.automator.filter.Filter + +import kotlin.collections.ArrayList + +/** + * Created by Stardust on 2017/3/9. + */ + +object DFS : SearchAlgorithm { + + override fun search(root: UiObject, filter: Filter, limit: Int): ArrayList { + val list = ArrayList() + if (filter.filter(root)) { + list.add(root) + if (list.size >= limit) { + return list + } + } + searchChildren(root, list, filter, limit) + return list + } + + private fun searchChildren(parent: UiObject, list: MutableList, filter: Filter, limit: Int) { + for (i in 0 until parent.childCount) { + val child = parent.child(i) ?: continue + val isTarget = filter.filter(child) + if (isTarget) { + list.add(child) + if (list.size >= limit) { + break + } + } + searchChildren(child, list, filter, limit) + if (!isTarget) { + child.recycle() + } + } + } + +} diff --git a/automator/src/main/java/com/stardust/automator/search/SearchAlgorithm.kt b/automator/src/main/java/com/stardust/automator/search/SearchAlgorithm.kt new file mode 100644 index 00000000..81206ecb --- /dev/null +++ b/automator/src/main/java/com/stardust/automator/search/SearchAlgorithm.kt @@ -0,0 +1,9 @@ +package com.stardust.automator.search + +import com.stardust.automator.UiObject +import com.stardust.automator.filter.Filter + +interface SearchAlgorithm { + + fun search(root: UiObject, filter: Filter, limit: Int = Int.MAX_VALUE): ArrayList +} \ No newline at end of file diff --git a/automator/src/test/java/com/stardust/automator/filter/DfsFilterTest.kt b/automator/src/test/java/com/stardust/automator/filter/DfsFilterTest.kt index 1f18154d..7a644d5c 100644 --- a/automator/src/test/java/com/stardust/automator/filter/DfsFilterTest.kt +++ b/automator/src/test/java/com/stardust/automator/filter/DfsFilterTest.kt @@ -2,6 +2,7 @@ package com.stardust.automator.filter import com.stardust.automator.test.TestUiObject import com.stardust.automator.UiObject +import com.stardust.automator.search.DFS import org.junit.Test import java.util.Random