我有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并立即停止循环。
答案 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));
}