【问题标题】:How to search in an List and my List is look like : List<Object> myList = new ArrayList<Object>() [duplicate]如何在列表中搜索,我的列表如下所示: List<Object> myList = new ArrayList<Object>() [重复]
【发布时间】:2016-04-07 13:00:27
【问题描述】:

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

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 个 for 循环

我使用的是 JAVA 1.6

我的 Employee 类有属性:

//Employee class
int eid;
BigInteger eSalary;
String eName, eAddress;

现在我想获取 List who's 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],.......................]

我希望不使用任何循环或所需的最小循环来实现这一目标,因为数据会很大

【问题讨论】:

    标签: list search arraylist java-6


    【解决方案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());
    

    编辑:可能 Stream 库内部仍在使用某种循环,但我不担心它的实现。

    【讨论】:

    • 感谢您的回复 marcellorvalle。但我使用的是 JAVA 1.6
    • 我明白了。我认为@JonasCz 的答案是可行的。我认为大量的员工不是问题。只是为了好奇:有没有办法在填充集合之前过滤数据?
    【解决方案2】:

    列表是一个顺序容器,要对列表进行任何类型的过滤,您唯一的选择就是对其进行迭代。

    对于您提到的查询,您可以使用Map 数据结构,其中BigInteger 类型作为键(表示薪水),List&lt;Employee&gt; 用于映射值类型。这将使您能够查找所有在恒定时间内获得一定薪水的员工,而无需遍历整个列表。

    不幸的是,该解决方案无法帮助您执行任何其他查询,例如“有多少员工的收入超过 60000”,以对您应该使用数据库的大型数据集执行所有类型的查询。

    PS:你不需要使用 BigInteger 类型作为薪水,除非你认为某人的收入超过 2,147,483,647

    【讨论】:

    • 先生,这是一个例子......我想应用这样的东西
    【解决方案3】:

    这样的事情应该可以解决问题;遍历列表,并删除您不想要的项目,只留下您确实想要的项目。

    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
    

    编辑:不,没有循环你不能这样做。为了做这种事情,你必须使用循环遍历你的集合。即使您使用库或 Java Streams API 来执行此操作,它仍然会在后台使用某种循环。但是,即使数据集很大,这也将非常有效。 (多大?为什么要避免使用循环?)

    【讨论】:

    • 数据量可能为100000
    • @Skyfall,没什么——只要数据不是很复杂(而你的数据不是很复杂),程序可以做到几秒钟就没有问题。
    • @marcellorvalle,感谢您的编辑!我不知道我是怎么错过的
    • 谢谢@JonasCz 我正在使用你的代码:-
    • @Skyfall,如果我的回答对您有帮助,您可以通过单击旁边的复选标记将其标记为已接受的答案。很高兴它有帮助:-)
    猜你喜欢
    • 2017-02-19
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多