Skip to content

Commit 67d1040

Browse files
committed
Improve: package sort algorithms
1 parent 3341084 commit 67d1040

File tree

2 files changed

+64
-19
lines changed

2 files changed

+64
-19
lines changed

app/src/main/java/io/neoterm/ui/pm/PackageManagerActivity.kt

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,14 @@ import android.widget.Toast
1818
import com.github.wrdlbrnft.sortedlistadapter.SortedListAdapter
1919
import io.neoterm.R
2020
import io.neoterm.backend.TerminalSession
21-
import io.neoterm.component.pm.PackageComponent
22-
import io.neoterm.component.pm.Source
23-
import io.neoterm.component.pm.SourceManager
24-
import io.neoterm.component.pm.SourceHelper
21+
import io.neoterm.component.pm.*
2522
import io.neoterm.frontend.component.ComponentManager
2623
import io.neoterm.frontend.config.NeoPreference
2724
import io.neoterm.frontend.config.NeoTermPath
2825
import io.neoterm.frontend.floating.TerminalDialog
2926
import io.neoterm.ui.pm.adapter.PackageAdapter
3027
import io.neoterm.ui.pm.model.PackageModel
28+
import io.neoterm.ui.pm.utils.StringDistance
3129
import io.neoterm.utils.PackageUtils
3230

3331
/**
@@ -232,18 +230,25 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
232230
}.start()
233231
}
234232

235-
private fun filter(models: List<PackageModel>, query: String?): List<PackageModel> {
236-
val filteredModelList = ArrayList<PackageModel>()
237-
if (query != null) {
238-
val lowerCaseQuery = query.toLowerCase()
239-
for (model in models) {
240-
val name = model.packageInfo.packageName!!.toLowerCase()
241-
val desc = model.packageInfo.description!!.toLowerCase()
242-
if (name.contains(lowerCaseQuery) || desc.contains(lowerCaseQuery)) {
243-
filteredModelList.add(model)
244-
}
245-
}
233+
private fun sortDistance(models: List<PackageModel>, query: String,
234+
mapper: (NeoPackageInfo) -> String): List<Pair<PackageModel, Int>> {
235+
return models
236+
.map({
237+
Pair(it, StringDistance.distance(mapper(it.packageInfo).toLowerCase(), query.toLowerCase()))
238+
})
239+
.sortedWith(Comparator { l, r -> r.second.compareTo(l.second) })
240+
.toList()
241+
}
242+
243+
private fun filter(models: List<PackageModel>, query: String): List<PackageModel> {
244+
val filteredModelList = mutableListOf<PackageModel>()
245+
val prepared = models.filter {
246+
it.packageInfo.packageName!!.contains(query, true)
247+
|| it.packageInfo.description!!.contains(query, true)
246248
}
249+
250+
sortDistance(prepared, query, { it.packageName!! }).mapTo(filteredModelList, { it.first })
251+
sortDistance(prepared, query, { it.description!! }).mapTo(filteredModelList, { it.first })
247252
return filteredModelList
248253
}
249254

@@ -252,10 +257,12 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
252257
}
253258

254259
override fun onQueryTextChange(text: String?): Boolean {
255-
val filteredModelList = filter(models, text)
256-
adapter.edit()
257-
.replaceAll(filteredModelList)
258-
.commit()
260+
if (text != null) {
261+
val filteredModelList = filter(models, text)
262+
adapter.edit()
263+
.replaceAll(filteredModelList)
264+
.commit()
265+
}
259266
return true
260267
}
261268

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.neoterm.ui.pm.utils;
2+
3+
/**
4+
* @author kiva
5+
*/
6+
7+
public class StringDistance {
8+
public static int distance(String source, String target) {
9+
char[] sources = source.toCharArray();
10+
char[] targets = target.toCharArray();
11+
int sourceLen = sources.length;
12+
int targetLen = targets.length;
13+
14+
int[][] d = new int[sourceLen + 1][targetLen + 1];
15+
for (int i = 0; i <= sourceLen; i++) {
16+
d[i][0] = i;
17+
}
18+
for (int i = 0; i <= targetLen; i++) {
19+
d[0][i] = i;
20+
}
21+
22+
for (int i = 1; i <= sourceLen; i++) {
23+
for (int j = 1; j <= targetLen; j++) {
24+
if (sources[i - 1] == targets[j - 1]) {
25+
d[i][j] = d[i - 1][j - 1];
26+
} else {
27+
int insert = d[i][j - 1] + 1;
28+
int delete = d[i - 1][j] + 1;
29+
int replace = d[i - 1][j - 1] + 1;
30+
d[i][j] = Math.min(insert, delete) > Math.min(delete, replace)
31+
? Math.min(delete, replace)
32+
: Math.min(insert, delete);
33+
}
34+
}
35+
}
36+
return d[sourceLen][targetLen];
37+
}
38+
}

0 commit comments

Comments
 (0)