如果Set包含具有某些字符串值的对象,如何检入java?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果Set包含具有某些字符串值的对象,如何检入java?相关的知识,希望对你有一定的参考价值。
我有一组对象。每个对象都有String值。
我需要选择this
值等于“direction”的所有对象。
是否可以不迭代集合?
谢谢。
一般来说,没有。您需要迭代集合并检查每个对象以查看属性是否等于您要搜索的值。这是一个O(n)
操作。
有一种情况可以在没有迭代的情况下完成。如果您的对象的equals
方法是根据String
属性的相等性定义的,并且如果hashCode
方法也正确实现,那么您可以使用hashSet.contains
在O(1)
时间内找到具有正确值的对象,而无需迭代该集合。
正如我所提到的,这是一个非常具体的用例,而不是一般解决方案。如果字符串是某种唯一标识符可能会有用,但它不适用于您的特定用例。
您可能还想考虑更适合您的用例的其他集合。例如,如果您使用的是Guava,那么您可以考虑使用Multimap。
有关
是的,这可以通过覆盖equals()
方法来实现。
@Override
public boolean equals (Object object) {
}
您只想检查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));
}
输出:
Check checkUserOne is in list or not Is checkUserOne Present = ? true Check checkUserTwo is in list or not Is checkUserTwo Present = ? false
你也可以在这个问题中使用Predicate
来过滤列表:What is the best way to filter a Java Collection?
我知道这是一个老问题,但......
简短的回答:不,这是不可能的......
使用其他人推荐的equals()
或contains()
时,应限制在用于过滤的属性实际上是对象Identity的一部分的情况。除了O(n)算法,我没有看到任何方法。
如果您正在考虑本机函数,Java 8带来了Stream API和函数式编程的概念,允许更简单,更清晰的循环调用。尽管如此,值得注意的是,对于您的情况,您的集合中的所有对象都必须进行检查,因此复杂性将保持为O(n)。
Java 8的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
}
你仍然可以使用contains()
方法。
您只需要映射初始集并将其转换为字符串集,只需要检查字段值是否存在于对象集中。
根据Felipe Leão和Michael Laffargue的先前答案,查看下一个示例。
public static void main(String[] args...){
Set<MyClass> mySet = new HashSet<>();
mySet.add(new MyClass("Obj 1"));
mySet.add(new MyClass("Obj 2"));
mySet.add(new MyClass("Obj 3"));
Set<String> mapped = mySet.stream()
.map(MyClass::getField())
.collect(Collectors.toSet());
mapped.contains("Obj 1");
mapped.contains("Obj 2");
mapped.contains("Obj 4");
// Result:
// true
// true
// false
}
以上是关于如果Set包含具有某些字符串值的对象,如何检入java?的主要内容,如果未能解决你的问题,请参考以下文章