Dog
和Cat
類重複的條目,我用的是代碼檢查來自<code>Animal</code>類,如果我想在<code>ArrayList</code>添加繼承在ArrayList中
pets.add(new Dog(name))
我怎樣才能找出一個名稱使用超過一旦?
我在尋找類似:pets.contain(...)
Dog
和Cat
類重複的條目,我用的是代碼檢查來自<code>Animal</code>類,如果我想在<code>ArrayList</code>添加繼承在ArrayList中
pets.add(new Dog(name))
我怎樣才能找出一個名稱使用超過一旦?
我在尋找類似:pets.contain(...)
如果您正在使用Java8您可以使用類似:
pets.stream().map(animal -> animal.getName()).contains(name);
這將返回布爾名稱是否已經在列表中。
的另一種方法是使用for循環:
boolean isNamePresent = false;
for (Animal pet: pets) {
if(pet.getname().equals(name)) {
isNamePresent = true;
}
}
其實是有一個contains method on List。它使用equals方法檢查是否相等,因此如果您的Dog
或Cat
類以相同名稱表示相同名稱的方式實現equals
,則可以簡單地使用contains
。
如果由於某種原因你不想這樣做(因爲你需要平等意味着別的東西),你可以迭代列表並找到一個同名的條目。或者,也可以使用流,如下所示:pets.stream().filter(pet -> pet.getName().equals(newName)).findAny().isPresent()
沒有一種方法可以使用本地函數執行此操作。
你可以嘗試以下方法:
int number = 0;
for (int i=0; i<pets.size(); i++){
if pets.get(i).getname().equalsIgnoreCase("nameYouWant") number++;
}
我可以不用循環嗎? –
沒有循環,這樣做的唯一方法是使用流: pets.stream()。filter(elem - > elem.getName()。equals(「NameYouWant」))。count(); – Lechucico
爲什麼這麼渴望避免循環?一條河流更糟糕,表現明智。 –
你的問題是模糊的。
如果你想從列表中找到的,被使用一次以上的名字,你可以這樣做
pets.stream()
.collect(Collectors.groupingBy(Animall::getName(), Collectors.counting()))
.entrySet().stream()
.filter(e->e.getValue() > 1)
.map(e->e.getKey())
.collect(Collectors.toList()));
,這將給你一個List<String>
包含名字出現不止一次
如果您只想在添加之前檢查名稱是否存在於pets
之前,我認爲您應該使用Map<String, Animal>
而不是List
。
您是否想要查找多次使用的名稱,或者您想要在添加之前檢查名稱是否正在使用中?你的問題和你的最後一行意味着不同的東西 –
爲什麼你不能使用set,而不是在這種情況下使用ArrayList –