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