2017-05-19 16 views
0

DogCat類重複的條目,我用的是代碼檢查來自<code>Animal</code>類,如果我想在<code>ArrayList</code>添加繼承在ArrayList中

pets.add(new Dog(name)) 

我怎樣才能找出一個名稱使用超過一旦?

我在尋找類似:pets.contain(...)

+0

您是否想要查找多次使用的名稱,或者您想要在添加之前檢查名稱是否正在使用中?你的問題和你的最後一行意味着不同的東西 –

+0

爲什麼你不能使用set,而不是在這種情況下使用ArrayList –

回答

0

如果您正在使用Java8您可以使用類似:

pets.stream().map(animal -> animal.getName()).contains(name); 

這將返回布爾名稱是否已經在列表中。

的另一種方法是使用for循環:

boolean isNamePresent = false; 
for (Animal pet: pets) { 
    if(pet.getname().equals(name)) { 
     isNamePresent = true; 
    } 
} 
1

其實是有一個contains method on List。它使用equals方法檢查是否相等,因此如果您的DogCat類以相同名稱表示相同名稱的方式實現equals,則可以簡單地使用contains

如果由於某種原因你不想這樣做(因爲你需要平等意味着別的東西),你可以迭代列表並找到一個同名的條目。或者,也可以使用流,如下所示:pets.stream().filter(pet -> pet.getName().equals(newName)).findAny().isPresent()

0

沒有一種方法可以使用本地函數執行此操作。

你可以嘗試以下方法:

int number = 0; 
for (int i=0; i<pets.size(); i++){ 
    if pets.get(i).getname().equalsIgnoreCase("nameYouWant") number++; 
} 
+0

我可以不用循環嗎? –

+0

沒有循環,這樣做的唯一方法是使用流: pets.stream()。filter(elem - > elem.getName()。equals(「NameYouWant」))。count(); – Lechucico

+0

爲什麼這麼渴望避免循環?一條河流更糟糕,表現明智。 –

0

你的問題是模糊的。

如果你想從列表中找到的,被使用一次以上的名字,你可以這樣做

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

相關問題