una - ¿Cómo comprobar en java si Set contiene un objeto con algún valor de cadena?
recorrer un arraylist de objetos en java (4)
En general, no. Debe iterar sobre el conjunto y verificar cada objeto para ver si la propiedad es igual al valor que está buscando. Esta es una operación O(n)
.
Hay una situación en la que podrías hacerlo sin iterar. Si el método equals
su objeto se define en términos de igualdad de esa propiedad de String
, y si el método hashCode
también se implementa correctamente, puede usar el hashSet.contains
para encontrar un objeto con el valor correcto en tiempo O(1)
sin necesidad de iterando sobre el conjunto.
Como mencioné, este es un caso de uso muy específico y no una solución general. Podría ser útil si la cadena fuera algún tipo de identificador único, pero no funcionará para su caso de uso específico.
También es posible que desee considerar otras colecciones que se adaptarían mejor a su caso de uso. Por ejemplo, si usa Guava, podría considerar el uso de un Multimap .
Relacionado
Tengo conjunto de objetos. Cada objeto tiene valor de cadena.
Necesito seleccionar todos los objetos que tengan this
valor igual a "dirección".
¿Es posible sin iterar sobre el conjunto?
Gracias.
Sé que esta es una vieja pregunta, pero ...
Respuesta corta: NO, no es posible ...
El uso de equals()
o contains()
según lo recomendado por otros miembros se debe restringir a situaciones en las que los atributos que está utilizando para el filtrado son en realidad parte de la identidad de los objetos. No veo otra manera que un algoritmo O (n).
Si está considerando funciones nativas, Java 8 trajo la API de Stream y los conceptos de Programación Funcional , lo que permite llamadas de bucle más fáciles y limpias. No obstante, vale la pena señalar que para su situación todos los objetos de su colección deberán ser revisados, por lo que la complejidad seguirá siendo O (n).
Ejemplo con el stream().filter()
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
}
Sí, esto es posible sobrescribiendo el método equals()
.
@Override
public boolean equals (Object object) {
}
Solo quieres comprobar que todo funciona en el método de iguales.
Código:
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));
}
Salida:
Check checkUserOne is in list or not Is checkUserOne Present = ? true Check checkUserTwo is in list or not Is checkUserTwo Present = ? false
También puede usar Predicate
como en esta pregunta para filtrar la lista: ¿Cuál es la mejor manera de filtrar una colección Java?