如何循环阵列列表,其中具有项目,并且项目具有多个变量



i有arraylist(mnamelist(,其中有项目(nameItem(,这些项目包含2个变量(字符串和int(。我也有一个输入字段,用户将新名称插入列表。

我需要检查列表中的每个项目,如果用户给出的名称不在这些项目中,则可以添加一个项目。如果找到匹配项,它应该给烤面包并立即停止循环。

我尝试的东西:

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();
        }
    }
}

很快,我意识到这里的问题是,每次无法进行比赛时,都会尝试添加该项目。它应该做的是,在检查了所有项目并且没有找到任何匹配之后,只有这样,它才能添加一次新名称,而不是在每个循环中。另外,如果找到匹配项,它应该给出烤面包并立即停止循环。

如果您的API级别足够高或简单的待遇循环,则可以使用Java 8流API,以检查列表是否已包含带有给定输入名称的条目。您只需要迭代列表,然后检查任何名称Initem是否包含与输入相等的名称。如果是,您可以做烤面包。否则,您可以使用给定输入创建一个新的名称Initem并将其添加到列表中。

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));
}

最新更新