Как зациклить Arraylist, который имеет элементы, а элементы имеют несколько переменных - PullRequest
0 голосов
/ 06 июля 2019

У меня есть arraylist (mNamelist), в котором есть элементы (NameItem), и эти элементы содержат 2 переменные (String и int).У меня также есть поле ввода, где пользователь вставляет новые имена в список.

Мне нужно проверить каждый элемент в списке, и если пользователь дал имя, которого нет ни в одном из этих элементов, он можетдобавить предмет.Если он найдет совпадение, он должен дать Toast и немедленно прекратить зацикливание.

что-то, что я попробовал:

private void addItem(int position) {
    /** Get user input (name) **/
    textAdd = findViewById(R.id.name_input);

    /** Check if that name already on a list **/
    for (int i = 0; i < mNameList.size(); i++) {

        /** Check namelists item, and in that item String variable named getText1 and check if it match to the name that user gave **/
        if (mNameList.get(i).getText1() == textAdd.toString().trim()) {
            /** If match, give toast and stop looping **/
            Toast toast= Toast.makeText(getApplicationContext(),
                    "This name is already on a list...", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
            toast.show();
            break;
        } else {
            /** If no matches, add name to the list **/
            mNameList.add(position, new NameItem(textAdd.getText().toString().trim()));
            sortArrayList();
            saveData();
            mAdapter.notifyItemInserted(position);
            textAdd.getText().clear();
        }
    }
}

Вскоре я понял, что проблема в том, что каждый раз, когда он не получитматч, он пытается добавить этот элемент.Что следует сделать, так это то, что ПОСЛЕ ВСЕХ элементов проверено И ни одного совпадения не найдено, только тогда он должен добавить это новое имя ОДИН РАЗ, а не в каждый цикл.Также, если он находит совпадение, он должен выдать этот тост и немедленно прекратить зацикливание.

1 Ответ

1 голос
/ 06 июля 2019

Вы можете использовать java 8 stream api, если ваш уровень api достаточно высок, или простой цикл for-each, чтобы проверить, содержит ли список уже запись с заданным именем ввода. Вам просто нужно перебрать свой список и проверить, содержит ли какой-либо элемент nameItem имя, равное вашему входу. Если да, вы можете сделать тост. В противном случае вы можете создать новый nameItem с заданным вводом и добавить его в свой список.

private boolean alreadyContainsNameWithForEach(Collection<NameItem> mNames, String input){
    for(NameItem item : mNames){
        if(item.getName().equals(input)){
            return true;
        }
    }
    return false;
}

private boolean alreadyContainsNameWithStreams(Collection<NameItem> mNames, String input){
    return mNames.stream().anyMatch(nameItem -> nameItem.getName().equals(input));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...