我想在列表中搜索,我的列表看起来像
List<Employee> oneEmp= new ArrayList<Employee>();
List<Employee> twoEmp= new ArrayList<Employee>();
oneEmp= [Employee [eid=1001, eName=Sam Smith, eAddress=Bangluru, eSalary=10000000], Employee [eid=0, eName=, eAddress=, eSalary=null], Employee [eid=1003, eName=Amt Lime, eAddress=G Bhagyoday, eSalary=200000], Employee [eid=1004, eName=Ash Wake, eAddress=BMC, eSalary=200000], Employee [eid=1005, eName=Will Smith, eAddress= Delhi, eSalary=200000], Employee [eid=1006, eName=Shya Ymwar, eAddress=Madras, eSalary=50000], Employee [eid=1007, eName=Nag Gam, eAddress=Pune, eSalary=10000000], Employee [eid=1008, eName=Arti, eAddress=Delhi, eSalary=10000000]]
twoEmp= [Employee [eid=0, eName=null, eAddress=null, eSalary=100000], Employee [eid=0, eName=null, eAddress=null, eSalary=50000], Employee [eid=0, eName=null, eAddress=null, eSalary=200000]]
我使用的代码如下: -
for(Employee two : twoEmp){
for (Iterator<Employee> iterator = oneEmp.iterator(); iterator.hasNext(); ) {
Employee e = iterator.next();
if (e.geteSalary() != null && two.geteSalary() != null && e.geteSalary().compareTo(two.geteSalary()) == 0) {
finalEmpList.add(e);
}
}
}
但这仍然需要2个循环
我正在使用JAVA 1.6
我的员工类有属性:
//Employee class
int eid;
BigInteger eSalary;
String eName, eAddress;
现在我想获取List中的所有对象Salary = 10000000
结果应为:
[员工[eid = 1001,eName = Sam Smith,eAddress = Bangluru,eSalary = 10000000],员工[eid = 1007,eName = Nag Gam,eAddress = Pune,eSalary = 10000000],员工[eid = 1008, eName = Arti,eAddress = Delhi,eSalary = 10000000],.........................]
我想实现不使用任何循环或需要最小循环,因为数据会很大
答案 0 :(得分:1)
是的,可以使用streams来避免循环。
首先,考虑使用通用集合:
List<Employee> employees = new ArrayList<>():
//add all employees to the list
现在,您可以使用streams过滤列表
List<Employee> filtered = employees.stream()
.filter(emp -> emp.getSalary() == 10000000)
.collect(Collectors.toList());
编辑:可能流库仍然在内部使用某种循环,但是它的实现对我来说是隐藏的,我不担心。
答案 1 :(得分:0)
这样的事情应该可以解决问题;迭代列表,删除您不想要的项目,只留下您 想要的项目。
List myList = new ArrayList(); //... add items
[...]
for (Iterator<Employee> iterator = myList.iterator(); iterator.hasNext(); ) {
Employee e = iterator.next();
if (e.getSalary() != 10000000) {
iterator.remove();
}
}
//your list now contains only employees whose salary = 10000000
编辑:不,没有循环,你不能这样做。为了做这种事情,你有使用循环迭代你的Collection。即使您使用库或Java Streams API来执行此操作,它仍然会使用某种循环。但是,即使数据集很大,这也会非常有效。 (有多大?为什么要避免使用循环?)
答案 2 :(得分:0)
List是一个顺序容器,对列表进行任何类型的过滤,你唯一的选择就是迭代它。
对于您提到的查询,您可以使用Map数据结构,其中BigInteger
类型用于键(代表薪水),List<Employee>
用于映射值类型。这将使您能够查找所有在固定时间内获得特定薪水的员工,而无需遍历整个列表。
不幸的是,此解决方案无法帮助您执行任何其他查询,例如&#34;有多少员工的收入超过60000&#34;,要对大型数据集执行所有类型的查询,您应该使用数据库中。
PS:除非你认为某人的收入超过2,147,483,647,否则你不需要使用BigInteger
类型的工资