Как мне организовать arraylist настраиваемого объекта в алфавитном порядке, который содержит две разные строки?

А теперь поподробнее. Я пишу приложение для словаря. Для этого я создал собственный объект под названием Word. Это Слово содержит термин и соответствующий ему перевод:

public class Word implements Serializable {

private int _id;
private int wordType;
private String engWordSi;
private String okyWordPl;
private String engWordPl;
private String okyWordSi;
private String engEx;
private String okyEx;

/** Creates a custom class, which allows save a term, it's translation, as well as the plural and example in both
 * languages
 * @param   _id     saves the Id of the Word in the Database
 * @param engWordSi saves the English translation of the word
 * @param okyWordSi saves the Oshikwanyama translation of the word
 * @param wordType saves the type of word in form of a number:
 *                 0 = phrase; 1 = noun; 2 = verb; 3 = adjective; 4 = pronoun; 5 = other
 */

public Word(int _id, int wordType, String engWordSi, String okyWordSi){
    this._id = _id;
    this.wordType = wordType;
    this.engWordSi = engWordSi;
    this.okyWordSi = okyWordSi;
}public int get_id(){
    return _id;
}
public void set_id(int i){
    _id = i;
}
public int getWordType(){
    return wordType;
}
public void setWordType(int i){
    if(i < 0 || i > 6){
        return;
    }
    wordType = i;
}
public String getEngWordSi(){
    return engWordSi;
}
public void setEngWordSi(String word){
    engWordSi = word;
}
public String getOkyWordSi(){
    return okyWordSi;
}
public void setOkyWordSi(String word){
    okyWordSi = word;
}
public String getEngWordPl(){
    return engWordPl;
}
public void setEngWordPl(String word){
    engWordPl = word;
}
public String getOkyWordPl(){
    return okyWordPl;
}
public void setOkyWordPl(String word){
    okyWordPl = word;
}
public String getEngEx(){
    return engEx;
}
public void setEngEx(String word){
    engEx = word;
}
public String getOkyEx(){
    return okyEx;
}
public void setOkyEx(String word){
    okyEx = word;
}

Данные загружаются через файл php, подключенный к базе данных. Оператор ORDER BY позволяет мне выбрать только один язык для упорядочивания результатов. Но мне нужно, чтобы поисковый запрос, который может быть найден в словах обоих языков, определял, является ли английское слово или слово Oshikwanyama словом, которое выстраивается по порядку. Я должен проверить, какой перевод использовать в каждом случае. Я предполагаю, что сделать это в onPostExecute (). Данные возвращаются файлом PHP в формате JSON. Оттуда я поместил их в ArrayList.

private class Query extends AsyncTask<Void, Void, Void>{
    @Override
    protected void onPostExecute(Void aVoid) {
        try{
            JSONArray jsonArray = new JSONArray(result);
            for (int i = 0; i < jsonArray.length(); i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                Word word = new Word(jsonObject.getInt("_id"), jsonObject.getInt("type"), jsonObject.getString("eng"), jsonObject.getString("oky") );
                arrayList.add(word);
                Log.d("JSON", word.toString());
            }
        }catch (JSONException e){
            e.printStackTrace();
        }
        ProgressBar bar = (ProgressBar) findViewById(R.id.bar);
        bar.setVisibility(View.GONE);
        Button button = (Button) findViewById(R.id.SearchButton);
        button.setVisibility(View.VISIBLE);
        super.onPostExecute(aVoid);
        if (arrayList.isEmpty()){
            Toast.makeText(SearchActivity.this, "Unfortunately there were no results, the missing word was sent to our developers.", Toast.LENGTH_LONG).show();
            return;
        }
        Intent intent = new Intent(SearchActivity.this, ResultActivity.class);
        ItemDetailsWrapper wrapper = new ItemDetailsWrapper(arrayList);
        intent.putExtra("results", wrapper);
        intent.putExtra("term", searchTerm);
        startActivity(intent);
    }

    InputStream inputStream = null;
    String result = "";

    @Override
    protected void onPreExecute() {
        if (arrayList != null){
        arrayList.clear();}
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... voids) {
        try{
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(uri.toString());
            //httpPost.setEntity(new UrlEncodedFormEntity(null));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            inputStream = httpEntity.getContent();
        }
        catch (UnsupportedEncodingException e1){
            e1.printStackTrace();
        } catch (ClientProtocolException e2){
            e2.printStackTrace();
        }catch (IllegalStateException e3){
            e3.printStackTrace();
        }catch (IOException e4){
            e4.printStackTrace();
        }try{
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();
            String line = null;
            while ((line = bufferedReader.readLine()) != null){
                stringBuilder.append(line + "\n");
            }
            inputStream.close();
            result = stringBuilder.toString();
        }catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }

}}

У меня уже есть место, где можно проверить, содержится ли искомый термин в английском языке или слове Oshikwanyama. Здесь я использую его для определения флага, используемого в макете.

public class WordAdapter extends ArrayAdapter<Word> {
private Context mContext;
private List<Word> wordList = new ArrayList<>();
private int srcCode;
private String term;

/** uses words and puts them into a list
 * 
 * @param context stores the context of the calling activity
 * @param list stores the ArrayList that was passed into the constructor, and which contains the
 *             content
 * @param searchTerm stores the term that was searched for in SearchActivity to later compare it
 *                   to the contents of the Word and to arrange the correct flag for the source
 *                   language
 */

public WordAdapter(@NonNull Context context, ArrayList<Word> list, String searchTerm) {
    super(context, 0 , list);
    mContext = context;
    wordList = list;
    term = searchTerm;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View listItem = convertView;
    if(listItem == null){
        listItem = LayoutInflater.from(mContext).inflate(R.layout.list_item,parent,false);}
    final Word currentWord = wordList.get(position);
    //Add Images for the flags of the countries and the flag
    final TextView sourceTerm = (TextView) listItem.findViewById(R.id.searchTerm);
    final TextView translationTerm = (TextView) listItem.findViewById(R.id.translationTerm);
    ImageView flag = (ImageView) listItem.findViewById(R.id.src_flag);
    ImageButton button = (ImageButton) listItem.findViewById(R.id.flag);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getContext(), EditorActivity.class);
            intent.putExtra("mode", "report");
            intent.putExtra("id", currentWord.get_id());
            intent.putExtra("source", sourceTerm.getText());
            intent.putExtra("trans", translationTerm.getText());
            getContext().startActivity(intent);
        }
    });
    if (currentWord.getOkyWordPl() == null){
        currentWord.setOkyWordPl("");
    }
    if (currentWord.getEngWordPl() == null){
        currentWord.setEngWordPl("");
    }
    if (currentWord.getEngWordSi().contains(term) || currentWord.getEngWordPl().contains(term)){
        srcCode = 0;
    }
    if (currentWord.getOkyWordSi().contains(term) || currentWord.getOkyWordPl().contains(term)){
        srcCode = 1;
    }
    if (srcCode == 0){
            sourceTerm.setText(currentWord.getEngWordSi());
            translationTerm.setText(currentWord.getOkyWordSi());
            flag.setImageResource(R.drawable.britain);
    }
    if (srcCode == 1){
        sourceTerm.setText(currentWord.getOkyWordSi());
        translationTerm.setText(currentWord.getEngWordSi());
        flag.setImageResource(R.drawable.namibia);
    }
    return listItem;
}}

Заранее спасибо. :)

Обновлено:

Добавление примеров слов: 1. EngWordSi: хорошо OkyWordSi: нава wordType: 2 2. EngWordSi: доброе утро OkyWordSi: wa lele po? wordType: 0 3. EngWordSi: утро OkyWordSi: онгула WordType: 1

0
0
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

что вы можете сделать, отсортируйте свойство объекта, как показано ниже, в вашем адаптере,

public WordAdapter(@NonNull Context context, ArrayList<Word> list, String searchTerm) {
    super(context, 0 , list);
    mContext = context;
    wordList = list;
    term = searchTerm;

Collections.sort(list, new Comparator<Word>() {
            @Override
            public int compare(Word word1, word2) {
                return word1.getEngWordSi().compareToIgnoreCase(word2.getEngWordSi());
            }
        });
}

это полезно для вас.

Вот мой демонстрационный код

public class Main {

    static class Word{
        String prority1;

        @Override
        public String toString() {
            return "Word{" +
                    "prority1='" + prority1 + '\'' +
                    '}';
        }
    }
    public static void main(String[] args) {
        ArrayList<Word> words = new ArrayList<>();
        Word word;
        for (int i = 0; i < 5; i++) {
            word =new Word();
            word.prority1 = "aaaa"+(5-i);
            words.add(word);
            System.out.println("wrod "+i+" is "+word);
        }
        Collections.sort(words, new Comparator<Word>() {
            @Override
            public int compare(Word o1, Word o2) {
                int ret = o1.prority1.compareTo(o2.prority1);
                if (ret > 0) {
                    return 1;
                } else if (ret < 0) {
                    return -1;
                }
                return 0;
            }
        });
        System.out.println("after sort check words");
        for (Word w : words) {
            System.out.println("check word:"+w);
        }
    }

}

и ниже вывод консоли:

wrod 0 is Word{prority1='aaaa5'}
wrod 1 is Word{prority1='aaaa4'}
wrod 2 is Word{prority1='aaaa3'}
wrod 3 is Word{prority1='aaaa2'}
wrod 4 is Word{prority1='aaaa1'}
after sort check words
check word:Word{prority1='aaaa1'}
check word:Word{prority1='aaaa2'}
check word:Word{prority1='aaaa3'}
check word:Word{prority1='aaaa4'}
check word:Word{prority1='aaaa5'}

Надеюсь, это поможет вам.

Просто чтобы проверить, понял ли я это, вы предлагаете добавить еще одну строку в класс Word, а затем, все равно проверяя ее в WordAdapter, добавить «приоритетную строку» к самому Word, а затем позволить ее отсортировать?

Adrian Breiding 31.10.2018 14:20

Нет, это просто пример, оставьте свой класс Word, замените prority1 единственным полем вашего Word, которое вы хотите отсортировать по нему.

aolphn 31.10.2018 14:22

А, хорошо, проблема в том, что есть два возможных поля, по которым предполагается сортировка, в зависимости от ввода пользователя. Поскольку вывод будет отображаться по-разному, независимо от того, содержится ли поисковый запрос в слове oshikwanyama или в английском слове

Adrian Breiding 31.10.2018 14:23

Не могли бы вы добавить несколько примеров данных Word?

aolphn 31.10.2018 14:28

Сделал это, хотя форматирование, похоже, не осталось таким, как хотелось

Adrian Breiding 31.10.2018 14:36

Позвольте нам продолжить обсуждение в чате.

Adrian Breiding 31.10.2018 14:43

Другие вопросы по теме