如何循环Arraylist,其中包含项目,并且项目具有多个变量

时间:2019-07-06 11:25:32

标签: java

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

很快,我意识到这里的问题是,每当没有匹配项时,它都会尝试添加该项目。它应该做的是在检查完所有项目并且没有找到匹配项之后,才应一次添加该新名称,而不是在每个循环中都添加一次。 另外,如果找到匹配项,则应给该Toast并立即停止循环。

1 个答案:

答案 0 :(得分:1)

如果您的api级别足够高,则可以使用java 8流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));
}