Fix result ordering

Julien LepillerThu Jul 29 14:18:52+0200 2021

9588e79

Fix result ordering

CHANGELOG.md

77
Here is a list of changes that are not yet part of a release, but that will
88
appear in next release.
99
10+
### Bug Fix
11+
12+
* Fix result ordering and ensure exact matches are shown first.
13+
1014
### Features
1115
1216
* It is now possible to filter the list of dictionaries by target language.

app/src/main/java/eu/lepiller/nani/MainActivity.java

99
import androidx.annotation.NonNull;
1010
import androidx.appcompat.app.AppCompatActivity;
1111
import androidx.appcompat.widget.Toolbar;
12-
import androidx.fragment.app.FragmentManager;
1312
import androidx.preference.PreferenceManager;
1413
import androidx.viewpager2.widget.ViewPager2;
1514

2827
import com.moji4j.MojiDetector;
2928
3029
import java.util.ArrayList;
31-
import java.util.Collections;
3230
import java.util.List;
3331
3432
import eu.lepiller.nani.dictionary.DictionaryException;

app/src/main/java/eu/lepiller/nani/ResultPagerAdapter.java

130130
            if(results == null)
131131
                return;
132132
133-
            int num = 0;
134133
            for(Result result: results) {
135-
                num++;
136-
                if (num > 10)
137-
                    break;
138134
                View child_result = LayoutInflater.from(context).inflate(R.layout.layout_result, result_view, false);
139135
140136
                FuriganaTextView kanji_view = child_result.findViewById(R.id.kanji_view);

app/src/main/java/eu/lepiller/nani/dictionary/DictionaryFactory.java

1515
import java.util.ArrayList;
1616
import java.util.Collections;
1717
import java.util.HashMap;
18+
import java.util.LinkedHashMap;
1819
import java.util.List;
1920
import java.util.Locale;
2021
import java.util.Map;

238239
            throw new NoDictionaryException();
239240
240241
        int available = 0;
241-
        HashMap<String, Result> results = new HashMap<>();
242+
        LinkedHashMap<String, Result> results = new LinkedHashMap<>();
242243
243244
        for(Dictionary d: dictionaries) {
244245
            if (d instanceof ResultDictionary && d.isDownloaded()) {

275276
        if(instance == null)
276277
            throw new NoDictionaryException();
277278
278-
        int available = 0;
279279
        Stack<KanjiResult> results = new Stack<>();
280280
281281
        for(Dictionary d: dictionaries) {
282282
            if (d instanceof KanjiDict && d.isDownloaded()) {
283-
                available++;
284283
                KanjiResult kanjiResult = ((KanjiDict) d).search(kanji);
285284
                if(kanjiResult != null) {
286285
                    results.add(kanjiResult);

app/src/main/java/eu/lepiller/nani/dictionary/ResultDictionary.java

88
import java.io.RandomAccessFile;
99
import java.util.ArrayList;
1010
import java.util.Arrays;
11+
import java.util.Collections;
1112
1213
import eu.lepiller.nani.result.Result;
1314

7778
        Log.v(TAG, "Getting values");
7879
        int valuesLength = file.readShort();
7980
        ArrayList<Integer> results = new ArrayList<>();
81+
        ArrayList<Integer> exactResults = new ArrayList<>();
8082
8183
        Log.v(TAG, "Number of values: " + valuesLength);
8284
        for(int i=0; i<valuesLength; i++) {
83-
            results.add(file.readInt());
85+
            exactResults.add(file.readInt());
8486
        }
8587
8688
        int transitionLength = file.readByte();

9597
            results.addAll(getValues(file, others[i]));
9698
        }
9799
98-
        Log.v(TAG, "result size: " + results.size());
99-
        return results;
100+
        Collections.sort(results);
101+
        Collections.sort(exactResults);
102+
103+
        Log.v(TAG, "exact result size: " + exactResults.size() + ", result size: " + results.size());
104+
        Log.v(TAG, "exact: " + Arrays.toString(exactResults.toArray()) + ", others: " + Arrays.toString(results.toArray()));
105+
        exactResults.addAll(results);
106+
        return exactResults;
100107
    }
101108
102109
    private ArrayList<Integer> searchTrie(RandomAccessFile file, long triePos, byte[] txt) throws IOException {

185192
                        uniqResults.add(i);
186193
                }
187194
188-
                int[] uniqResultsArray = new int[uniqResults.size()];
189-
                for(int i=0; i<uniqResults.size(); i++) {
190-
                    uniqResultsArray[i] = uniqResults.get(i);
191-
                }
192-
                Arrays.sort(uniqResultsArray);
193-
194-
                Log.v(TAG, uniqResults.toString());
195+
                Log.v(TAG, Arrays.toString(uniqResults.toArray()));
195196
196197
                int num = 0;
197-
                for(int i: uniqResultsArray) {
198+
                for(int i: uniqResults) {
198199
                    if(num > 10)
199200
                        break;
200201
                    num++;
201-
                    r.add(0, getValue(file, i));
202+
                    r.add(getValue(file, i));
202203
                }
203204
                return r;
204205
            } catch (FileNotFoundException e) {

app/src/main/res/layout/layout_result.xml

44
    android:layout_height="wrap_content"
55
    xmlns:app="http://schemas.android.com/apk/res-auto"
66
    android:orientation="vertical"
7-
    android:layout_marginBottom="8dp">
7+
    android:layout_marginBottom="8dp"
8+
    android:layout_marginTop="8dp">
89
910
    <LinearLayout
1011
        android:layout_width="wrap_content"