如果Set包含带有一些字符串值的对象,如何检入java?

我有一组对象。 每个对象都有String值。

我需要选择具有this值等于“direction”的所有对象。

没有迭代集合是否可能?

谢谢。

一般来说,没有。 您需要迭代集合并检查每个对象以查看属性是否等于您要搜索的值。 这是O(n)操作。

有一种情况你可以在没有迭代的情况下完成它。 如果对象的equals方法是根据String属性的相等性定义的,并且如果hashCode方法也正确实现,那么您可以使用hashSet.containsO(1)时间内找到具有正确值的对象,而不需要迭代集合。

正如我所提到的,这是一个非常具体的用例,而不是一般解决方案。 如果字符串是某种唯一标识符可能会有用,但它不适用于您的特定用例。

您可能还想考虑更适合您的用例的其他集合。 例如,如果您使用的是Guava,则可以考虑使用Multimap 。

有关

  • HashMap在同一个键下有多个值

是的,这可以通过覆盖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 employeeList = new ArrayList(); 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 Preasent = ? " + 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 Preasent = ? " + employeeList.contains(checkUserTwo)); } 

输出:

 Check checkUserOne is in list or not Is checkUserOne Preasent = ? true Check checkUserTwo is in list or not Is checkUserTwo Preasent = ? false 

你也可以在这个问题中使用Predicate来过滤列表: 过滤Java Collection的最佳方法是什么?

我知道这是一个老问题,但……

简短的回答:不,这是不可能的……

使用其他人推荐的equals()contains()应限制在用于过滤的属性实际上是对象Identity的一部分的情况。 我没有看到任何方法,只有O(n)算法。

如果您正在考虑本机函数,Java 8带来了Stream API函数式编程的概念,允许更简单,更清晰的循环调用。 尽管如此,值得注意的是,对于您的情况,您的集合中的所有对象都必须进行检查,因此复杂性将保持为O(n)。

Java 8的stream().filter()示例stream().filter()

 public static void main(String[] args...){ Set 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 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 }