如何在List和我的列表中搜索如下所示:List <object> myList = new ArrayList <object>()

时间:2016-04-07 13:00:27

标签: list search arraylist java-6

我想在列表中搜索,我的列表看起来像

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],.........................]

我想实现不使用任何循环或需要最小循环,因为数据会很大

3 个答案:

答案 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类型的工资