Skip to content

Commit 1ff36a7

Browse files
author
hyb1996
committed
新增 选择器搜索算法BFS(广度优先搜索)
1 parent 4b3d4ab commit 1ff36a7

File tree

7 files changed

+107
-55
lines changed

7 files changed

+107
-55
lines changed

automator/src/main/java/com/stardust/automator/UiGlobalSelector.kt

+22-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ package com.stardust.automator
33
import android.graphics.Rect
44
import android.os.Build
55
import com.stardust.automator.filter.*
6+
import com.stardust.automator.search.BFS
7+
import com.stardust.automator.search.DFS
8+
import com.stardust.automator.search.SearchAlgorithm
9+
import java.lang.IllegalArgumentException
610

711
/**
812
* Created by Stardust on 2017/3/8.
@@ -11,6 +15,7 @@ import com.stardust.automator.filter.*
1115
open class UiGlobalSelector {
1216

1317
private val mSelector = Selector()
18+
private var mSearchAlgorithm: SearchAlgorithm = DFS
1419

1520
//// 第一类筛选条件
1621

@@ -399,9 +404,6 @@ open class UiGlobalSelector {
399404
return findOf(node, Int.MAX_VALUE)
400405
}
401406

402-
fun findAndReturnList(node: UiObject, max: Int = Int.MAX_VALUE): List<UiObject> {
403-
return DFS(mSelector, max).search(node)
404-
}
405407

406408
fun findOneOf(node: UiObject): UiObject? {
407409
val collection = findOf(node, 1)
@@ -415,6 +417,23 @@ open class UiGlobalSelector {
415417
return this
416418
}
417419

420+
fun algorithm(algorithm: String): UiGlobalSelector {
421+
if (algorithm.equals("BFS", true)) {
422+
mSearchAlgorithm = BFS
423+
return this
424+
}
425+
if (algorithm.equals("DFS", true)) {
426+
mSearchAlgorithm = DFS
427+
return this
428+
}
429+
throw IllegalArgumentException("unknown algorithm: $algorithm")
430+
}
431+
432+
fun findAndReturnList(node: UiObject, max: Int = Int.MAX_VALUE): List<UiObject> {
433+
return mSearchAlgorithm.search(node, mSelector, max)
434+
}
435+
436+
418437
override fun toString(): String {
419438
return mSelector.toString()
420439
}

automator/src/main/java/com/stardust/automator/filter/BFS.kt

-10
This file was deleted.

automator/src/main/java/com/stardust/automator/filter/DFS.kt

-42
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.stardust.automator.search
2+
3+
import com.stardust.automator.UiObject
4+
import com.stardust.automator.filter.Filter
5+
import java.util.*
6+
import kotlin.collections.ArrayList
7+
8+
object BFS : SearchAlgorithm {
9+
10+
override fun search(root: UiObject, filter: Filter, limit: Int): ArrayList<UiObject> {
11+
val result = ArrayList<UiObject>()
12+
val queue = ArrayDeque<UiObject>()
13+
queue.add(root)
14+
while (!queue.isEmpty()) {
15+
val top = queue.poll()
16+
val isTarget = filter.filter(top)
17+
if (isTarget) {
18+
result.add(top)
19+
if (result.size > limit) {
20+
return result
21+
}
22+
}
23+
for (i in 0 until top.childCount) {
24+
queue.add(top.child(i) ?: continue)
25+
}
26+
if (!isTarget && top !== root) {
27+
top.recycle()
28+
}
29+
}
30+
return result
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.stardust.automator.search
2+
3+
import com.stardust.automator.UiObject
4+
import com.stardust.automator.filter.Filter
5+
6+
import kotlin.collections.ArrayList
7+
8+
/**
9+
* Created by Stardust on 2017/3/9.
10+
*/
11+
12+
object DFS : SearchAlgorithm {
13+
14+
override fun search(root: UiObject, filter: Filter, limit: Int): ArrayList<UiObject> {
15+
val list = ArrayList<UiObject>()
16+
if (filter.filter(root)) {
17+
list.add(root)
18+
if (list.size >= limit) {
19+
return list
20+
}
21+
}
22+
searchChildren(root, list, filter, limit)
23+
return list
24+
}
25+
26+
private fun searchChildren(parent: UiObject, list: MutableList<UiObject>, filter: Filter, limit: Int) {
27+
for (i in 0 until parent.childCount) {
28+
val child = parent.child(i) ?: continue
29+
val isTarget = filter.filter(child)
30+
if (isTarget) {
31+
list.add(child)
32+
if (list.size >= limit) {
33+
break
34+
}
35+
}
36+
searchChildren(child, list, filter, limit)
37+
if (!isTarget) {
38+
child.recycle()
39+
}
40+
}
41+
}
42+
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.stardust.automator.search
2+
3+
import com.stardust.automator.UiObject
4+
import com.stardust.automator.filter.Filter
5+
6+
interface SearchAlgorithm {
7+
8+
fun search(root: UiObject, filter: Filter, limit: Int = Int.MAX_VALUE): ArrayList<UiObject>
9+
}

automator/src/test/java/com/stardust/automator/filter/DfsFilterTest.kt

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.stardust.automator.filter
22

33
import com.stardust.automator.test.TestUiObject
44
import com.stardust.automator.UiObject
5+
import com.stardust.automator.search.DFS
56

67
import org.junit.Test
78
import java.util.Random

0 commit comments

Comments
 (0)