Mar*_*ers 24
一般来说,没有.您需要迭代集合并检查每个对象以查看属性是否等于您要搜索的值.这是一个O(n)
操作.
有一种情况可以在没有迭代的情况下完成.如果对象的equals
方法是根据该String
属性的相等性定义的,并且如果hashCode
方法也正确实现,那么您可以使用它hashSet.contains
来及时查找具有正确值的对象,O(1)
而无需迭代该集合.
正如我所提到的,这是一个非常具体的用例,而不是一般解决方案.如果字符串是某种唯一标识符可能会有用,但它不适用于您的特定用例.
您可能还想考虑更适合您的用例的其他集合.例如,如果您使用的是Guava,则可以考虑使用Multimap.
有关
是的,可以通过覆盖equals()
方法来实现.
@Override
public boolean equals (Object object) {
}
Run Code Online (Sandbox Code Playgroud)
您只想检查equals方法中的所有内容.
码:
package com.webapp.test;
import java.util.ArrayList;
import java.util.List;
public class EmployeeModel {
public EmployeeModel(String name, String designation, long age) {
this.name = name;
this.designation = designation;
this.age = age;
}
private String name;
private String designation;
private long age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesignation() {
return designation;
}
public void setDesignation(String designation) {
this.designation = designation;
}
public long getAge() {
return age;
}
public void setAge(long age) {
this.age = age;
}
@Override
public boolean equals (Object object) {
boolean result = false;
if (object == null || object.getClass() != getClass()) {
result = false;
} else {
EmployeeModel employee = (EmployeeModel) object;
if (this.name == employee.getName() && this.designation == employee.getDesignation() && this.age.equals(employee.getAge())) {
result = true;
}
}
return result;
}
}
public static void main(String args[]) {
EmployeeModel first = new EmployeeModel("Sameer", "Developer", 25);
EmployeeModel second = new EmployeeModel("Jon", "Manager", 30);
EmployeeModel third = new EmployeeModel("Priyanka", "Tester", 24);
List<EmployeeModel> employeeList = new ArrayList<EmployeeModel>();
employeeList.add(first);
employeeList.add(second);
employeeList.add(third);
EmployeeModel checkUserOne = new EmployeeModel("Sameer", "Developer", 25);
System.out.println("Check checkUserOne is in list or not ");
System.out.println("Is checkUserOne Present = ? " + employeeList.contains(checkUserOne));
EmployeeModel checkUserTwo = new EmployeeModel("Tim", "Tester", 24);
System.out.println("Check checkUserTwo is in list or not");
System.out.println("Is checkUserTwo Present = ? " + employeeList.contains(checkUserTwo));
}
Run Code Online (Sandbox Code Playgroud)
输出:
Run Code Online (Sandbox Code Playgroud)Check checkUserOne is in list or not Is checkUserOne Present = ? true Check checkUserTwo is in list or not Is checkUserTwo Present = ? false
我知道这是一个老问题,但是......
使用equals()
或contains()
按照其他人的建议应该仅限于您用于过滤的属性实际上是对象身份的一部分的情况。除了 O(n) 算法,我看不到任何方法。
如果您正在考虑原生函数,Java 8 带来了Stream API和Functional Programming 的概念,允许更简单、更清晰的循环调用。尽管如此,值得注意的是,对于您的情况,必须检查集合中的所有对象,因此复杂性将保持为 O(n)。
stream().filter()
public static void main(String[] args...){
Set<MyClass> mySet = new HashSet<>();
mySet.add(new MyClass("Obj 1", "Rio de Janeiro"));
mySet.add(new MyClass("Obj 2", "London"));
mySet.add(new MyClass("Obj 3", "New York"));
mySet.add(new MyClass("Obj 4", "Rio de Janeiro"));
Set<MyClass> filtered = mySet.stream()
.filter(mc -> mc.getCity().equals('Rio de Janeiro'))
.collect(Collectors.toSet());
filtered.forEach(mc -> System.out.println("Object: "+mc.getName()));
// Result:
// Object: Obj 1
// Object: Obj 4
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
73273 次 |
最近记录: |